component
GRM1555C1H100JA01D - Murata
Public Made by Adomby adom
MLCC 10 pF +/-5 %, 50 V, C0G, 0402 (1005 metric)
← Commit history
Component record for grm1555c1h100ja01d: files batch 1
36 files changed
+3473−2
C_0402_1005Metric_GRM1555C1H100JA01D.kicad_mod+112GRM1555C1H100JA01D.kicad_sym+23GRM1555C1H100JA01D.step+1123LICENSE+13README.md+117−2docs/grm1555c1h100ja01d-datasheet.pdfdocs/hero.pngdocs/models/package-reference-step.pngdocs/verify/grm1555c1h100ja01d-check.json+51docs/verify/grm1555c1h100ja01d-overlay.pngland-pattern/README.md+32land-pattern/land-check.json+1land-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+125package-reference.glbpackage.json+10provenance.json+123provenance/tools/build.py+149provenance/tools/grm1555c1h100ja01d-overlay-spec.json+39provenance/tools/landcheck.py+116provenance/tools/lod.py+170provenance/tools/ortho.py+123provenance/tools/overlay_chip.py+159provenance/tools/parts.py+229provenance/tools/records.py+350verification.json+230C_0402_1005Metric_GRM1555C1H100JA01D.kicad_modadded+112@@ -0,0 +1,112 @@+(footprint "C_0402_1005Metric_GRM1555C1H100JA01D"+ (version 20260206)+ (generator "kicad-footprint-generator")+ (layer "F.Cu")+ (descr "Capacitor SMD 0402 (1005 Metric), square (rectangular) end terminal, IPC-7351 nominal, (Body size source: IPC-SM-782 page 76, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf)")+ (tags "capacitor")+ (property "Reference" "REF**"+ (at 0 -1.16 0)+ (layer "F.SilkS")+ (effects+ (font+ (size 1 1)+ (thickness 0.15)+ )+ )+ )+ (property "Value" "C_0402_1005Metric"+ (at 0 1.16 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.107836 -0.36)+ (end 0.107836 -0.36)+ (stroke+ (width 0.12)+ (type solid)+ )+ (layer "F.SilkS")+ )+ (fp_line+ (start -0.107836 0.36)+ (end 0.107836 0.36)+ (stroke+ (width 0.12)+ (type solid)+ )+ (layer "F.SilkS")+ )+ (fp_rect+ (start -0.91 -0.46)+ (end 0.91 0.46)+ (stroke+ (width 0.05)+ (type solid)+ )+ (fill no)+ (layer "F.CrtYd")+ )+ (fp_rect+ (start -0.5 -0.25)+ (end 0.5 0.25)+ (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.25 0.25)+ (thickness 0.04)+ )+ )+ )+ (pad "1" smd roundrect+ (at -0.48 0)+ (size 0.56 0.62)+ (layers "F.Cu" "F.Mask" "F.Paste")+ (roundrect_rratio 0.25)+ )+ (pad "2" smd roundrect+ (at 0.48 0)+ (size 0.56 0.62)+ (layers "F.Cu" "F.Mask" "F.Paste")+ (roundrect_rratio 0.25)+ )+ (embedded_fonts no)+ (model "${KIPRJMOD}/GRM1555C1H100JA01D.step"+ (offset+ (xyz 0 0 0)+ )+ (scale+ (xyz 1 1 1)+ )+ (rotate+ (xyz 0 0 0)+ )+ )+)
GRM1555C1H100JA01D.kicad_symadded+23@@ -0,0 +1,23 @@+(kicad_symbol_lib (version 20241209) (generator "adom_passive_symbol")+ (symbol "GRM1555C1H100JA01D" (pin_numbers (hide yes)) (pin_names (offset 0.254) (hide yes)) (exclude_from_sim no) (in_bom yes) (on_board yes)+ (property "Reference" "C" (at 2.54 1.27 0) (effects (font (size 1.27 1.27)) (justify left)))+ (property "Value" "10pF" (at 2.54 -1.27 0) (effects (font (size 1.27 1.27)) (justify left)))+ (property "Footprint" "C_0402_1005Metric_GRM1555C1H100JA01D" (at 0 -7.62 0) (effects (font (size 1.27 1.27)) hide))+ (property "Datasheet" "https://search.murata.co.jp/Ceramy/image/img/A01X/G101/ENG/GRM1555C1H100JA01-01A.pdf" (at 0 -10.16 0) (effects (font (size 1.27 1.27)) hide))+ (property "Description" "MLCC 10 pF +/-5 %, 50 V, C0G, 0402 (1005 metric)" (at 0 -12.7 0) (effects (font (size 1.27 1.27)) hide))+ (property "MPN" "GRM1555C1H100JA01D" (at 0 -15.24 0) (effects (font (size 1.27 1.27)) hide))+ (property "Manufacturer" "Murata" (at 0 -17.78 0) (effects (font (size 1.27 1.27)) hide))+ (property "Mouser" "81-GRM1555C1H100JA1D" (at 0 -20.32 0) (effects (font (size 1.27 1.27)) hide))+ (property "DigiKey" "490-5921-2-ND" (at 0 -22.86 0) (effects (font (size 1.27 1.27)) hide))+ (property "LCSC" "C76946" (at 0 -25.4 0) (effects (font (size 1.27 1.27)) hide))+ (property "ki_keywords" "capacitor 0402 GRM1555C1H100JA01D" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))+ (symbol "GRM1555C1H100JA01D_0_1"+ (polyline (pts (xy -2.032 -0.762) (xy 2.032 -0.762)) (stroke (width 0.508) (type default)) (fill (type none)))+ (polyline (pts (xy -2.032 0.762) (xy 2.032 0.762)) (stroke (width 0.508) (type default)) (fill (type none)))+ )+ (symbol "GRM1555C1H100JA01D_1_1"+ (pin passive line (at 0 3.81 270) (length 2.794) (name "~" (effects (font (size 1.27 1.27)))) (number "1" (effects (font (size 1.27 1.27)))))+ (pin passive line (at 0 -3.81 90) (length 2.794) (name "~" (effects (font (size 1.27 1.27)))) (number "2" (effects (font (size 1.27 1.27)))))+ )+ )+)
GRM1555C1H100JA01D.stepadded+1123@@ -0,0 +1,1123 @@+ISO-10303-21;+HEADER;+/* C_0402_1005Metric.step 3D STEP model for use in ECAD systems+ * Copyright (C) 2017, 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 C_0402_1005Metric'),+/* implementation_level */ '2;1');++FILE_NAME(+/* name */ 'C_0402_1005Metric.step',+/* time_stamp */ '2017-12-10T01:08:42',+/* 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('C_0402_1005Metric','C_0402_1005Metric','',(#8));+#8 = PRODUCT_CONTEXT('',#2,'mechanical');+#9 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design');+#10 = ADVANCED_BREP_SHAPE_REPRESENTATION('',(#11,#15),#869);+#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,#93,#124,#149,#174,#198,#222,#247,#272,#289,+#375,#407,#431,#456,#480,#505,#529,#554,#571,#657,#688,#713,#738,+#762,#786,#811,#836,#853));+#17 = ADVANCED_FACE('',(#18),#88,.F.);+#18 = FACE_BOUND('',#19,.F.);+#19 = EDGE_LOOP('',(#20,#30,#39,#47,#56,#64,#73,#81));+#20 = ORIENTED_EDGE('',*,*,#21,.F.);+#21 = EDGE_CURVE('',#22,#24,#26,.T.);+#22 = VERTEX_POINT('',#23);+#23 = CARTESIAN_POINT('',(-0.5,-0.25,2.E-02));+#24 = VERTEX_POINT('',#25);+#25 = CARTESIAN_POINT('',(-0.5,-0.25,0.48));+#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.23,0.));+#34 = CIRCLE('',#35,2.E-02);+#35 = AXIS2_PLACEMENT_3D('',#36,#37,#38);+#36 = CARTESIAN_POINT('',(-0.5,-0.23,2.E-02));+#37 = DIRECTION('',(1.,0.,-0.));+#38 = DIRECTION('',(0.,0.,1.));+#39 = ORIENTED_EDGE('',*,*,#40,.T.);+#40 = EDGE_CURVE('',#32,#41,#43,.T.);+#41 = VERTEX_POINT('',#42);+#42 = CARTESIAN_POINT('',(-0.5,0.23,0.));+#43 = LINE('',#44,#45);+#44 = CARTESIAN_POINT('',(-0.5,-0.25,0.));+#45 = VECTOR('',#46,1.);+#46 = DIRECTION('',(0.,1.,0.));+#47 = ORIENTED_EDGE('',*,*,#48,.F.);+#48 = EDGE_CURVE('',#49,#41,#51,.T.);+#49 = VERTEX_POINT('',#50);+#50 = CARTESIAN_POINT('',(-0.5,0.25,2.E-02));+#51 = CIRCLE('',#52,2.E-02);+#52 = AXIS2_PLACEMENT_3D('',#53,#54,#55);+#53 = CARTESIAN_POINT('',(-0.5,0.23,2.E-02));+#54 = DIRECTION('',(-1.,0.,0.));+#55 = DIRECTION('',(0.,0.,1.));+#56 = ORIENTED_EDGE('',*,*,#57,.T.);+#57 = EDGE_CURVE('',#49,#58,#60,.T.);+#58 = VERTEX_POINT('',#59);+#59 = CARTESIAN_POINT('',(-0.5,0.25,0.48));+#60 = LINE('',#61,#62);+#61 = CARTESIAN_POINT('',(-0.5,0.25,0.));+#62 = VECTOR('',#63,1.);+#63 = DIRECTION('',(0.,0.,1.));+#64 = ORIENTED_EDGE('',*,*,#65,.T.);+#65 = EDGE_CURVE('',#58,#66,#68,.T.);+#66 = VERTEX_POINT('',#67);+#67 = CARTESIAN_POINT('',(-0.5,0.23,0.5));+#68 = CIRCLE('',#69,2.E-02);+#69 = AXIS2_PLACEMENT_3D('',#70,#71,#72);+#70 = CARTESIAN_POINT('',(-0.5,0.23,0.48));+#71 = DIRECTION('',(1.,0.,-0.));+#72 = DIRECTION('',(0.,0.,1.));+#73 = ORIENTED_EDGE('',*,*,#74,.F.);+#74 = EDGE_CURVE('',#75,#66,#77,.T.);+#75 = VERTEX_POINT('',#76);+#76 = CARTESIAN_POINT('',(-0.5,-0.23,0.5));+#77 = LINE('',#78,#79);+#78 = CARTESIAN_POINT('',(-0.5,-0.25,0.5));+#79 = VECTOR('',#80,1.);+#80 = DIRECTION('',(0.,1.,0.));+#81 = ORIENTED_EDGE('',*,*,#82,.F.);+#82 = EDGE_CURVE('',#24,#75,#83,.T.);+#83 = CIRCLE('',#84,2.E-02);+#84 = AXIS2_PLACEMENT_3D('',#85,#86,#87);+#85 = CARTESIAN_POINT('',(-0.5,-0.23,0.48));+#86 = DIRECTION('',(-1.,0.,0.));+#87 = DIRECTION('',(0.,0.,1.));+#88 = PLANE('',#89);+#89 = AXIS2_PLACEMENT_3D('',#90,#91,#92);+#90 = CARTESIAN_POINT('',(-0.5,-0.25,0.));+#91 = DIRECTION('',(1.,0.,0.));+#92 = DIRECTION('',(0.,0.,1.));+#93 = ADVANCED_FACE('',(#94),#119,.F.);+#94 = FACE_BOUND('',#95,.F.);+#95 = EDGE_LOOP('',(#96,#106,#112,#113));+#96 = ORIENTED_EDGE('',*,*,#97,.F.);+#97 = EDGE_CURVE('',#98,#100,#102,.T.);+#98 = VERTEX_POINT('',#99);+#99 = CARTESIAN_POINT('',(-0.3,-0.25,2.E-02));+#100 = VERTEX_POINT('',#101);+#101 = CARTESIAN_POINT('',(-0.3,-0.25,0.48));+#102 = LINE('',#103,#104);+#103 = CARTESIAN_POINT('',(-0.3,-0.25,0.));+#104 = VECTOR('',#105,1.);+#105 = DIRECTION('',(0.,0.,1.));+#106 = ORIENTED_EDGE('',*,*,#107,.F.);+#107 = EDGE_CURVE('',#22,#98,#108,.T.);+#108 = LINE('',#109,#110);+#109 = CARTESIAN_POINT('',(-0.5,-0.25,2.E-02));+#110 = VECTOR('',#111,1.);+#111 = DIRECTION('',(1.,0.,0.));+#112 = ORIENTED_EDGE('',*,*,#21,.T.);+#113 = ORIENTED_EDGE('',*,*,#114,.T.);+#114 = EDGE_CURVE('',#24,#100,#115,.T.);+#115 = LINE('',#116,#117);+#116 = CARTESIAN_POINT('',(-0.5,-0.25,0.48));+#117 = VECTOR('',#118,1.);+#118 = DIRECTION('',(1.,0.,0.));+#119 = PLANE('',#120);+#120 = AXIS2_PLACEMENT_3D('',#121,#122,#123);+#121 = CARTESIAN_POINT('',(-0.5,-0.25,0.));+#122 = DIRECTION('',(0.,1.,0.));+#123 = DIRECTION('',(0.,0.,1.));+#124 = ADVANCED_FACE('',(#125),#144,.T.);+#125 = FACE_BOUND('',#126,.T.);+#126 = EDGE_LOOP('',(#127,#128,#136,#143));+#127 = ORIENTED_EDGE('',*,*,#31,.T.);+#128 = ORIENTED_EDGE('',*,*,#129,.T.);+#129 = EDGE_CURVE('',#32,#130,#132,.T.);+#130 = VERTEX_POINT('',#131);+#131 = CARTESIAN_POINT('',(-0.3,-0.23,0.));+#132 = LINE('',#133,#134);+#133 = CARTESIAN_POINT('',(-0.5,-0.23,0.));+#134 = VECTOR('',#135,1.);+#135 = DIRECTION('',(1.,0.,0.));+#136 = ORIENTED_EDGE('',*,*,#137,.F.);+#137 = EDGE_CURVE('',#98,#130,#138,.T.);+#138 = CIRCLE('',#139,2.E-02);+#139 = AXIS2_PLACEMENT_3D('',#140,#141,#142);+#140 = CARTESIAN_POINT('',(-0.3,-0.23,2.E-02));+#141 = DIRECTION('',(1.,0.,-0.));+#142 = DIRECTION('',(0.,0.,1.));+#143 = ORIENTED_EDGE('',*,*,#107,.F.);+#144 = CYLINDRICAL_SURFACE('',#145,2.E-02);+#145 = AXIS2_PLACEMENT_3D('',#146,#147,#148);+#146 = CARTESIAN_POINT('',(-0.5,-0.23,2.E-02));+#147 = DIRECTION('',(1.,0.,0.));+#148 = DIRECTION('',(0.,-1.,0.));+#149 = ADVANCED_FACE('',(#150),#169,.T.);+#150 = FACE_BOUND('',#151,.F.);+#151 = EDGE_LOOP('',(#152,#153,#161,#168));+#152 = ORIENTED_EDGE('',*,*,#82,.T.);+#153 = ORIENTED_EDGE('',*,*,#154,.T.);+#154 = EDGE_CURVE('',#75,#155,#157,.T.);+#155 = VERTEX_POINT('',#156);+#156 = CARTESIAN_POINT('',(-0.3,-0.23,0.5));+#157 = LINE('',#158,#159);+#158 = CARTESIAN_POINT('',(-0.5,-0.23,0.5));+#159 = VECTOR('',#160,1.);+#160 = DIRECTION('',(1.,0.,0.));+#161 = ORIENTED_EDGE('',*,*,#162,.F.);+#162 = EDGE_CURVE('',#100,#155,#163,.T.);+#163 = CIRCLE('',#164,2.E-02);+#164 = AXIS2_PLACEMENT_3D('',#165,#166,#167);+#165 = CARTESIAN_POINT('',(-0.3,-0.23,0.48));+#166 = DIRECTION('',(-1.,0.,0.));+#167 = DIRECTION('',(0.,0.,1.));+#168 = ORIENTED_EDGE('',*,*,#114,.F.);+#169 = CYLINDRICAL_SURFACE('',#170,2.E-02);+#170 = AXIS2_PLACEMENT_3D('',#171,#172,#173);+#171 = CARTESIAN_POINT('',(-0.5,-0.23,0.48));+#172 = DIRECTION('',(1.,0.,0.));+#173 = DIRECTION('',(0.,-1.,0.));+#174 = ADVANCED_FACE('',(#175),#193,.F.);+#175 = FACE_BOUND('',#176,.F.);+#176 = EDGE_LOOP('',(#177,#178,#179,#187));+#177 = ORIENTED_EDGE('',*,*,#40,.F.);+#178 = ORIENTED_EDGE('',*,*,#129,.T.);+#179 = ORIENTED_EDGE('',*,*,#180,.T.);+#180 = EDGE_CURVE('',#130,#181,#183,.T.);+#181 = VERTEX_POINT('',#182);+#182 = CARTESIAN_POINT('',(-0.3,0.23,0.));+#183 = LINE('',#184,#185);+#184 = CARTESIAN_POINT('',(-0.3,-0.25,0.));+#185 = VECTOR('',#186,1.);+#186 = DIRECTION('',(0.,1.,0.));+#187 = ORIENTED_EDGE('',*,*,#188,.F.);+#188 = EDGE_CURVE('',#41,#181,#189,.T.);+#189 = LINE('',#190,#191);+#190 = CARTESIAN_POINT('',(-0.5,0.23,0.));+#191 = VECTOR('',#192,1.);+#192 = DIRECTION('',(1.,0.,0.));+#193 = PLANE('',#194);+#194 = AXIS2_PLACEMENT_3D('',#195,#196,#197);+#195 = CARTESIAN_POINT('',(-0.5,-0.25,0.));+#196 = DIRECTION('',(0.,0.,1.));+#197 = DIRECTION('',(1.,0.,0.));+#198 = ADVANCED_FACE('',(#199),#217,.T.);+#199 = FACE_BOUND('',#200,.T.);+#200 = EDGE_LOOP('',(#201,#202,#203,#211));+#201 = ORIENTED_EDGE('',*,*,#74,.F.);+#202 = ORIENTED_EDGE('',*,*,#154,.T.);+#203 = ORIENTED_EDGE('',*,*,#204,.T.);+#204 = EDGE_CURVE('',#155,#205,#207,.T.);+#205 = VERTEX_POINT('',#206);+#206 = CARTESIAN_POINT('',(-0.3,0.23,0.5));+#207 = LINE('',#208,#209);+#208 = CARTESIAN_POINT('',(-0.3,-0.25,0.5));+#209 = VECTOR('',#210,1.);+#210 = DIRECTION('',(0.,1.,0.));+#211 = ORIENTED_EDGE('',*,*,#212,.F.);+#212 = EDGE_CURVE('',#66,#205,#213,.T.);+#213 = LINE('',#214,#215);+#214 = CARTESIAN_POINT('',(-0.5,0.23,0.5));+#215 = VECTOR('',#216,1.);+#216 = DIRECTION('',(1.,0.,0.));+#217 = PLANE('',#218);+#218 = AXIS2_PLACEMENT_3D('',#219,#220,#221);+#219 = CARTESIAN_POINT('',(-0.5,-0.25,0.5));+#220 = DIRECTION('',(0.,0.,1.));+#221 = DIRECTION('',(1.,0.,0.));+#222 = ADVANCED_FACE('',(#223),#242,.T.);+#223 = FACE_BOUND('',#224,.F.);+#224 = EDGE_LOOP('',(#225,#226,#227,#236));+#225 = ORIENTED_EDGE('',*,*,#48,.T.);+#226 = ORIENTED_EDGE('',*,*,#188,.T.);+#227 = ORIENTED_EDGE('',*,*,#228,.F.);+#228 = EDGE_CURVE('',#229,#181,#231,.T.);+#229 = VERTEX_POINT('',#230);+#230 = CARTESIAN_POINT('',(-0.3,0.25,2.E-02));+#231 = CIRCLE('',#232,2.E-02);+#232 = AXIS2_PLACEMENT_3D('',#233,#234,#235);+#233 = CARTESIAN_POINT('',(-0.3,0.23,2.E-02));+#234 = DIRECTION('',(-1.,0.,0.));+#235 = DIRECTION('',(0.,0.,1.));+#236 = ORIENTED_EDGE('',*,*,#237,.F.);+#237 = EDGE_CURVE('',#49,#229,#238,.T.);+#238 = LINE('',#239,#240);+#239 = CARTESIAN_POINT('',(-0.5,0.25,2.E-02));+#240 = VECTOR('',#241,1.);+#241 = DIRECTION('',(1.,0.,0.));+#242 = CYLINDRICAL_SURFACE('',#243,2.E-02);+#243 = AXIS2_PLACEMENT_3D('',#244,#245,#246);+#244 = CARTESIAN_POINT('',(-0.5,0.23,2.E-02));+#245 = DIRECTION('',(1.,0.,0.));+#246 = DIRECTION('',(0.,1.,0.));+#247 = ADVANCED_FACE('',(#248),#267,.T.);+#248 = FACE_BOUND('',#249,.T.);+#249 = EDGE_LOOP('',(#250,#251,#252,#261));+#250 = ORIENTED_EDGE('',*,*,#65,.T.);+#251 = ORIENTED_EDGE('',*,*,#212,.T.);+#252 = ORIENTED_EDGE('',*,*,#253,.F.);+#253 = EDGE_CURVE('',#254,#205,#256,.T.);+#254 = VERTEX_POINT('',#255);+#255 = CARTESIAN_POINT('',(-0.3,0.25,0.48));+#256 = CIRCLE('',#257,2.E-02);+#257 = AXIS2_PLACEMENT_3D('',#258,#259,#260);+#258 = CARTESIAN_POINT('',(-0.3,0.23,0.48));+#259 = DIRECTION('',(1.,0.,-0.));+#260 = DIRECTION('',(0.,0.,1.));+#261 = ORIENTED_EDGE('',*,*,#262,.F.);+#262 = EDGE_CURVE('',#58,#254,#263,.T.);+#263 = LINE('',#264,#265);+#264 = CARTESIAN_POINT('',(-0.5,0.25,0.48));+#265 = VECTOR('',#266,1.);+#266 = DIRECTION('',(1.,0.,0.));+#267 = CYLINDRICAL_SURFACE('',#268,2.E-02);+#268 = AXIS2_PLACEMENT_3D('',#269,#270,#271);+#269 = CARTESIAN_POINT('',(-0.5,0.23,0.48));+#270 = DIRECTION('',(1.,0.,0.));+#271 = DIRECTION('',(0.,1.,0.));+#272 = ADVANCED_FACE('',(#273),#284,.T.);+#273 = FACE_BOUND('',#274,.T.);+#274 = EDGE_LOOP('',(#275,#281,#282,#283));+#275 = ORIENTED_EDGE('',*,*,#276,.F.);+#276 = EDGE_CURVE('',#229,#254,#277,.T.);+#277 = LINE('',#278,#279);+#278 = CARTESIAN_POINT('',(-0.3,0.25,0.));+#279 = VECTOR('',#280,1.);+#280 = DIRECTION('',(0.,0.,1.));+#281 = ORIENTED_EDGE('',*,*,#237,.F.);+#282 = ORIENTED_EDGE('',*,*,#57,.T.);+#283 = ORIENTED_EDGE('',*,*,#262,.T.);+#284 = PLANE('',#285);+#285 = AXIS2_PLACEMENT_3D('',#286,#287,#288);+#286 = CARTESIAN_POINT('',(-0.5,0.25,0.));+#287 = DIRECTION('',(0.,1.,0.));+#288 = DIRECTION('',(0.,0.,1.));+#289 = ADVANCED_FACE('',(#290,#300),#370,.T.);+#290 = FACE_BOUND('',#291,.T.);+#291 = EDGE_LOOP('',(#292,#293,#294,#295,#296,#297,#298,#299));+#292 = ORIENTED_EDGE('',*,*,#97,.F.);+#293 = ORIENTED_EDGE('',*,*,#137,.T.);+#294 = ORIENTED_EDGE('',*,*,#180,.T.);+#295 = ORIENTED_EDGE('',*,*,#228,.F.);+#296 = ORIENTED_EDGE('',*,*,#276,.T.);+#297 = ORIENTED_EDGE('',*,*,#253,.T.);+#298 = ORIENTED_EDGE('',*,*,#204,.F.);+#299 = ORIENTED_EDGE('',*,*,#162,.F.);+#300 = FACE_BOUND('',#301,.T.);+#301 = EDGE_LOOP('',(#302,#313,#321,#330,#338,#347,#355,#364));+#302 = ORIENTED_EDGE('',*,*,#303,.F.);+#303 = EDGE_CURVE('',#304,#306,#308,.T.);+#304 = VERTEX_POINT('',#305);+#305 = CARTESIAN_POINT('',(-0.3,-0.23,4.E-02));+#306 = VERTEX_POINT('',#307);+#307 = CARTESIAN_POINT('',(-0.3,-0.21,2.E-02));+#308 = CIRCLE('',#309,2.E-02);+#309 = AXIS2_PLACEMENT_3D('',#310,#311,#312);+#310 = CARTESIAN_POINT('',(-0.3,-0.21,4.E-02));+#311 = DIRECTION('',(1.,0.,-0.));+#312 = DIRECTION('',(0.,0.,1.));+#313 = ORIENTED_EDGE('',*,*,#314,.T.);+#314 = EDGE_CURVE('',#304,#315,#317,.T.);+#315 = VERTEX_POINT('',#316);+#316 = CARTESIAN_POINT('',(-0.3,-0.23,0.46));+#317 = LINE('',#318,#319);+#318 = CARTESIAN_POINT('',(-0.3,-0.23,2.E-02));+#319 = VECTOR('',#320,1.);+#320 = DIRECTION('',(0.,0.,1.));+#321 = ORIENTED_EDGE('',*,*,#322,.T.);+#322 = EDGE_CURVE('',#315,#323,#325,.T.);+#323 = VERTEX_POINT('',#324);+#324 = CARTESIAN_POINT('',(-0.3,-0.21,0.48));+#325 = CIRCLE('',#326,2.E-02);+#326 = AXIS2_PLACEMENT_3D('',#327,#328,#329);+#327 = CARTESIAN_POINT('',(-0.3,-0.21,0.46));+#328 = DIRECTION('',(-1.,0.,0.));+#329 = DIRECTION('',(0.,0.,1.));+#330 = ORIENTED_EDGE('',*,*,#331,.T.);+#331 = EDGE_CURVE('',#323,#332,#334,.T.);+#332 = VERTEX_POINT('',#333);+#333 = CARTESIAN_POINT('',(-0.3,0.21,0.48));+#334 = LINE('',#335,#336);+#335 = CARTESIAN_POINT('',(-0.3,-0.23,0.48));+#336 = VECTOR('',#337,1.);+#337 = DIRECTION('',(0.,1.,0.));+#338 = ORIENTED_EDGE('',*,*,#339,.F.);+#339 = EDGE_CURVE('',#340,#332,#342,.T.);+#340 = VERTEX_POINT('',#341);+#341 = CARTESIAN_POINT('',(-0.3,0.23,0.46));+#342 = CIRCLE('',#343,2.E-02);+#343 = AXIS2_PLACEMENT_3D('',#344,#345,#346);+#344 = CARTESIAN_POINT('',(-0.3,0.21,0.46));+#345 = DIRECTION('',(1.,0.,-0.));+#346 = DIRECTION('',(0.,0.,1.));+#347 = ORIENTED_EDGE('',*,*,#348,.F.);+#348 = EDGE_CURVE('',#349,#340,#351,.T.);+#349 = VERTEX_POINT('',#350);+#350 = CARTESIAN_POINT('',(-0.3,0.23,4.E-02));+#351 = LINE('',#352,#353);+#352 = CARTESIAN_POINT('',(-0.3,0.23,2.E-02));+#353 = VECTOR('',#354,1.);+#354 = DIRECTION('',(0.,0.,1.));+#355 = ORIENTED_EDGE('',*,*,#356,.T.);+#356 = EDGE_CURVE('',#349,#357,#359,.T.);+#357 = VERTEX_POINT('',#358);+#358 = CARTESIAN_POINT('',(-0.3,0.21,2.E-02));+#359 = CIRCLE('',#360,2.E-02);+#360 = AXIS2_PLACEMENT_3D('',#361,#362,#363);+#361 = CARTESIAN_POINT('',(-0.3,0.21,4.E-02));+#362 = DIRECTION('',(-1.,0.,0.));+#363 = DIRECTION('',(0.,0.,1.));+#364 = ORIENTED_EDGE('',*,*,#365,.F.);+#365 = EDGE_CURVE('',#306,#357,#366,.T.);+#366 = LINE('',#367,#368);+#367 = CARTESIAN_POINT('',(-0.3,-0.23,2.E-02));+#368 = VECTOR('',#369,1.);+#369 = DIRECTION('',(0.,1.,0.));+#370 = PLANE('',#371);+#371 = AXIS2_PLACEMENT_3D('',#372,#373,#374);+#372 = CARTESIAN_POINT('',(-0.3,-0.25,0.));+#373 = DIRECTION('',(1.,0.,0.));+#374 = DIRECTION('',(0.,0.,1.));+#375 = ADVANCED_FACE('',(#376),#402,.T.);+#376 = FACE_BOUND('',#377,.T.);+#377 = EDGE_LOOP('',(#378,#379,#387,#396));+#378 = ORIENTED_EDGE('',*,*,#303,.T.);+#379 = ORIENTED_EDGE('',*,*,#380,.T.);+#380 = EDGE_CURVE('',#306,#381,#383,.T.);+#381 = VERTEX_POINT('',#382);+#382 = CARTESIAN_POINT('',(0.3,-0.21,2.E-02));+#383 = LINE('',#384,#385);+#384 = CARTESIAN_POINT('',(-0.3,-0.21,2.E-02));+#385 = VECTOR('',#386,1.);+#386 = DIRECTION('',(1.,0.,0.));+#387 = ORIENTED_EDGE('',*,*,#388,.F.);+#388 = EDGE_CURVE('',#389,#381,#391,.T.);+#389 = VERTEX_POINT('',#390);+#390 = CARTESIAN_POINT('',(0.3,-0.23,4.E-02));+#391 = CIRCLE('',#392,2.E-02);+#392 = AXIS2_PLACEMENT_3D('',#393,#394,#395);+#393 = CARTESIAN_POINT('',(0.3,-0.21,4.E-02));+#394 = DIRECTION('',(1.,0.,-0.));+#395 = DIRECTION('',(0.,0.,1.));+#396 = ORIENTED_EDGE('',*,*,#397,.F.);+#397 = EDGE_CURVE('',#304,#389,#398,.T.);+#398 = LINE('',#399,#400);+#399 = CARTESIAN_POINT('',(-0.3,-0.23,4.E-02));+#400 = VECTOR('',#401,1.);+#401 = DIRECTION('',(1.,0.,0.));+#402 = CYLINDRICAL_SURFACE('',#403,2.E-02);+#403 = AXIS2_PLACEMENT_3D('',#404,#405,#406);+#404 = CARTESIAN_POINT('',(-0.3,-0.21,4.E-02));+#405 = DIRECTION('',(1.,0.,0.));+#406 = DIRECTION('',(0.,-1.,0.));+#407 = ADVANCED_FACE('',(#408),#426,.F.);+#408 = FACE_BOUND('',#409,.F.);+#409 = EDGE_LOOP('',(#410,#411,#412,#420));+#410 = ORIENTED_EDGE('',*,*,#365,.F.);+#411 = ORIENTED_EDGE('',*,*,#380,.T.);+#412 = ORIENTED_EDGE('',*,*,#413,.T.);+#413 = EDGE_CURVE('',#381,#414,#416,.T.);+#414 = VERTEX_POINT('',#415);+#415 = CARTESIAN_POINT('',(0.3,0.21,2.E-02));+#416 = LINE('',#417,#418);+#417 = CARTESIAN_POINT('',(0.3,-0.23,2.E-02));+#418 = VECTOR('',#419,1.);+#419 = DIRECTION('',(0.,1.,0.));+#420 = ORIENTED_EDGE('',*,*,#421,.F.);+#421 = EDGE_CURVE('',#357,#414,#422,.T.);+#422 = LINE('',#423,#424);+#423 = CARTESIAN_POINT('',(-0.3,0.21,2.E-02));+#424 = VECTOR('',#425,1.);+#425 = DIRECTION('',(1.,0.,0.));+#426 = PLANE('',#427);+#427 = AXIS2_PLACEMENT_3D('',#428,#429,#430);+#428 = CARTESIAN_POINT('',(-0.3,-0.23,2.E-02));+#429 = DIRECTION('',(0.,0.,1.));+#430 = DIRECTION('',(1.,0.,0.));+#431 = ADVANCED_FACE('',(#432),#451,.T.);+#432 = FACE_BOUND('',#433,.F.);+#433 = EDGE_LOOP('',(#434,#435,#436,#445));+#434 = ORIENTED_EDGE('',*,*,#356,.T.);+#435 = ORIENTED_EDGE('',*,*,#421,.T.);+#436 = ORIENTED_EDGE('',*,*,#437,.F.);+#437 = EDGE_CURVE('',#438,#414,#440,.T.);+#438 = VERTEX_POINT('',#439);+#439 = CARTESIAN_POINT('',(0.3,0.23,4.E-02));+#440 = CIRCLE('',#441,2.E-02);+#441 = AXIS2_PLACEMENT_3D('',#442,#443,#444);+#442 = CARTESIAN_POINT('',(0.3,0.21,4.E-02));+#443 = DIRECTION('',(-1.,0.,0.));+#444 = DIRECTION('',(0.,0.,1.));+#445 = ORIENTED_EDGE('',*,*,#446,.F.);+#446 = EDGE_CURVE('',#349,#438,#447,.T.);+#447 = LINE('',#448,#449);+#448 = CARTESIAN_POINT('',(-0.3,0.23,4.E-02));+#449 = VECTOR('',#450,1.);+#450 = DIRECTION('',(1.,0.,0.));+#451 = CYLINDRICAL_SURFACE('',#452,2.E-02);+#452 = AXIS2_PLACEMENT_3D('',#453,#454,#455);+#453 = CARTESIAN_POINT('',(-0.3,0.21,4.E-02));+#454 = DIRECTION('',(1.,0.,0.));+#455 = DIRECTION('',(0.,1.,0.));+#456 = ADVANCED_FACE('',(#457),#475,.T.);+#457 = FACE_BOUND('',#458,.T.);+#458 = EDGE_LOOP('',(#459,#467,#468,#469));+#459 = ORIENTED_EDGE('',*,*,#460,.F.);+#460 = EDGE_CURVE('',#438,#461,#463,.T.);+#461 = VERTEX_POINT('',#462);+#462 = CARTESIAN_POINT('',(0.3,0.23,0.46));+#463 = LINE('',#464,#465);+#464 = CARTESIAN_POINT('',(0.3,0.23,2.E-02));+#465 = VECTOR('',#466,1.);+#466 = DIRECTION('',(0.,0.,1.));+#467 = ORIENTED_EDGE('',*,*,#446,.F.);+#468 = ORIENTED_EDGE('',*,*,#348,.T.);+#469 = ORIENTED_EDGE('',*,*,#470,.T.);+#470 = EDGE_CURVE('',#340,#461,#471,.T.);+#471 = LINE('',#472,#473);+#472 = CARTESIAN_POINT('',(-0.3,0.23,0.46));+#473 = VECTOR('',#474,1.);+#474 = DIRECTION('',(1.,0.,0.));+#475 = PLANE('',#476);+#476 = AXIS2_PLACEMENT_3D('',#477,#478,#479);+#477 = CARTESIAN_POINT('',(-0.3,0.23,2.E-02));+#478 = DIRECTION('',(0.,1.,0.));+#479 = DIRECTION('',(0.,0.,1.));+#480 = ADVANCED_FACE('',(#481),#500,.T.);+#481 = FACE_BOUND('',#482,.T.);+#482 = EDGE_LOOP('',(#483,#484,#492,#499));+#483 = ORIENTED_EDGE('',*,*,#339,.T.);+#484 = ORIENTED_EDGE('',*,*,#485,.T.);+#485 = EDGE_CURVE('',#332,#486,#488,.T.);+#486 = VERTEX_POINT('',#487);+#487 = CARTESIAN_POINT('',(0.3,0.21,0.48));+#488 = LINE('',#489,#490);+#489 = CARTESIAN_POINT('',(-0.3,0.21,0.48));+#490 = VECTOR('',#491,1.);+#491 = DIRECTION('',(1.,0.,0.));+#492 = ORIENTED_EDGE('',*,*,#493,.F.);+#493 = EDGE_CURVE('',#461,#486,#494,.T.);+#494 = CIRCLE('',#495,2.E-02);+#495 = AXIS2_PLACEMENT_3D('',#496,#497,#498);+#496 = CARTESIAN_POINT('',(0.3,0.21,0.46));+#497 = DIRECTION('',(1.,0.,-0.));+#498 = DIRECTION('',(0.,0.,1.));+#499 = ORIENTED_EDGE('',*,*,#470,.F.);+#500 = CYLINDRICAL_SURFACE('',#501,2.E-02);+#501 = AXIS2_PLACEMENT_3D('',#502,#503,#504);+#502 = CARTESIAN_POINT('',(-0.3,0.21,0.46));+#503 = DIRECTION('',(1.,0.,0.));+#504 = DIRECTION('',(0.,1.,0.));+#505 = ADVANCED_FACE('',(#506),#524,.T.);+#506 = FACE_BOUND('',#507,.T.);+#507 = EDGE_LOOP('',(#508,#509,#517,#523));+#508 = ORIENTED_EDGE('',*,*,#331,.F.);+#509 = ORIENTED_EDGE('',*,*,#510,.T.);+#510 = EDGE_CURVE('',#323,#511,#513,.T.);+#511 = VERTEX_POINT('',#512);+#512 = CARTESIAN_POINT('',(0.3,-0.21,0.48));+#513 = LINE('',#514,#515);+#514 = CARTESIAN_POINT('',(-0.3,-0.21,0.48));+#515 = VECTOR('',#516,1.);+#516 = DIRECTION('',(1.,0.,0.));+#517 = ORIENTED_EDGE('',*,*,#518,.T.);+#518 = EDGE_CURVE('',#511,#486,#519,.T.);+#519 = LINE('',#520,#521);+#520 = CARTESIAN_POINT('',(0.3,-0.23,0.48));+#521 = VECTOR('',#522,1.);+#522 = DIRECTION('',(0.,1.,0.));+#523 = ORIENTED_EDGE('',*,*,#485,.F.);+#524 = PLANE('',#525);+#525 = AXIS2_PLACEMENT_3D('',#526,#527,#528);+#526 = CARTESIAN_POINT('',(-0.3,-0.23,0.48));+#527 = DIRECTION('',(0.,0.,1.));+#528 = DIRECTION('',(1.,0.,0.));+#529 = ADVANCED_FACE('',(#530),#549,.T.);+#530 = FACE_BOUND('',#531,.F.);+#531 = EDGE_LOOP('',(#532,#533,#534,#543));+#532 = ORIENTED_EDGE('',*,*,#322,.T.);+#533 = ORIENTED_EDGE('',*,*,#510,.T.);+#534 = ORIENTED_EDGE('',*,*,#535,.F.);+#535 = EDGE_CURVE('',#536,#511,#538,.T.);+#536 = VERTEX_POINT('',#537);+#537 = CARTESIAN_POINT('',(0.3,-0.23,0.46));+#538 = CIRCLE('',#539,2.E-02);+#539 = AXIS2_PLACEMENT_3D('',#540,#541,#542);+#540 = CARTESIAN_POINT('',(0.3,-0.21,0.46));+#541 = DIRECTION('',(-1.,0.,0.));+#542 = DIRECTION('',(0.,0.,1.));+#543 = ORIENTED_EDGE('',*,*,#544,.F.);+#544 = EDGE_CURVE('',#315,#536,#545,.T.);+#545 = LINE('',#546,#547);+#546 = CARTESIAN_POINT('',(-0.3,-0.23,0.46));+#547 = VECTOR('',#548,1.);+#548 = DIRECTION('',(1.,0.,0.));+#549 = CYLINDRICAL_SURFACE('',#550,2.E-02);+#550 = AXIS2_PLACEMENT_3D('',#551,#552,#553);+#551 = CARTESIAN_POINT('',(-0.3,-0.21,0.46));+#552 = DIRECTION('',(1.,0.,0.));+#553 = DIRECTION('',(0.,-1.,0.));+#554 = ADVANCED_FACE('',(#555),#566,.F.);+#555 = FACE_BOUND('',#556,.F.);+#556 = EDGE_LOOP('',(#557,#563,#564,#565));+#557 = ORIENTED_EDGE('',*,*,#558,.F.);+#558 = EDGE_CURVE('',#389,#536,#559,.T.);+#559 = LINE('',#560,#561);+#560 = CARTESIAN_POINT('',(0.3,-0.23,2.E-02));+#561 = VECTOR('',#562,1.);+#562 = DIRECTION('',(0.,0.,1.));+#563 = ORIENTED_EDGE('',*,*,#397,.F.);+#564 = ORIENTED_EDGE('',*,*,#314,.T.);+#565 = ORIENTED_EDGE('',*,*,#544,.T.);+#566 = PLANE('',#567);+#567 = AXIS2_PLACEMENT_3D('',#568,#569,#570);+#568 = CARTESIAN_POINT('',(-0.3,-0.23,2.E-02));+#569 = DIRECTION('',(0.,1.,0.));+#570 = DIRECTION('',(0.,0.,1.));+#571 = ADVANCED_FACE('',(#572,#642),#652,.F.);+#572 = FACE_BOUND('',#573,.F.);+#573 = EDGE_LOOP('',(#574,#584,#593,#601,#610,#618,#627,#635));+#574 = ORIENTED_EDGE('',*,*,#575,.F.);+#575 = EDGE_CURVE('',#576,#578,#580,.T.);+#576 = VERTEX_POINT('',#577);+#577 = CARTESIAN_POINT('',(0.3,-0.25,2.E-02));+#578 = VERTEX_POINT('',#579);+#579 = CARTESIAN_POINT('',(0.3,-0.25,0.48));+#580 = LINE('',#581,#582);+#581 = CARTESIAN_POINT('',(0.3,-0.25,0.));+#582 = VECTOR('',#583,1.);+#583 = DIRECTION('',(0.,0.,1.));+#584 = ORIENTED_EDGE('',*,*,#585,.T.);+#585 = EDGE_CURVE('',#576,#586,#588,.T.);+#586 = VERTEX_POINT('',#587);+#587 = CARTESIAN_POINT('',(0.3,-0.23,0.));+#588 = CIRCLE('',#589,2.E-02);+#589 = AXIS2_PLACEMENT_3D('',#590,#591,#592);+#590 = CARTESIAN_POINT('',(0.3,-0.23,2.E-02));+#591 = DIRECTION('',(1.,0.,-0.));+#592 = DIRECTION('',(0.,0.,1.));+#593 = ORIENTED_EDGE('',*,*,#594,.T.);+#594 = EDGE_CURVE('',#586,#595,#597,.T.);+#595 = VERTEX_POINT('',#596);+#596 = CARTESIAN_POINT('',(0.3,0.23,0.));+#597 = LINE('',#598,#599);+#598 = CARTESIAN_POINT('',(0.3,-0.25,0.));+#599 = VECTOR('',#600,1.);+#600 = DIRECTION('',(0.,1.,0.));+#601 = ORIENTED_EDGE('',*,*,#602,.F.);+#602 = EDGE_CURVE('',#603,#595,#605,.T.);+#603 = VERTEX_POINT('',#604);+#604 = CARTESIAN_POINT('',(0.3,0.25,2.E-02));+#605 = CIRCLE('',#606,2.E-02);+#606 = AXIS2_PLACEMENT_3D('',#607,#608,#609);+#607 = CARTESIAN_POINT('',(0.3,0.23,2.E-02));+#608 = DIRECTION('',(-1.,0.,0.));+#609 = DIRECTION('',(0.,0.,1.));+#610 = ORIENTED_EDGE('',*,*,#611,.T.);+#611 = EDGE_CURVE('',#603,#612,#614,.T.);+#612 = VERTEX_POINT('',#613);+#613 = CARTESIAN_POINT('',(0.3,0.25,0.48));+#614 = LINE('',#615,#616);+#615 = CARTESIAN_POINT('',(0.3,0.25,0.));+#616 = VECTOR('',#617,1.);+#617 = DIRECTION('',(0.,0.,1.));+#618 = ORIENTED_EDGE('',*,*,#619,.T.);+#619 = EDGE_CURVE('',#612,#620,#622,.T.);+#620 = VERTEX_POINT('',#621);+#621 = CARTESIAN_POINT('',(0.3,0.23,0.5));+#622 = CIRCLE('',#623,2.E-02);+#623 = AXIS2_PLACEMENT_3D('',#624,#625,#626);+#624 = CARTESIAN_POINT('',(0.3,0.23,0.48));+#625 = DIRECTION('',(1.,0.,-0.));+#626 = DIRECTION('',(0.,0.,1.));+#627 = ORIENTED_EDGE('',*,*,#628,.F.);+#628 = EDGE_CURVE('',#629,#620,#631,.T.);+#629 = VERTEX_POINT('',#630);+#630 = CARTESIAN_POINT('',(0.3,-0.23,0.5));+#631 = LINE('',#632,#633);+#632 = CARTESIAN_POINT('',(0.3,-0.25,0.5));+#633 = VECTOR('',#634,1.);+#634 = DIRECTION('',(0.,1.,0.));+#635 = ORIENTED_EDGE('',*,*,#636,.F.);+#636 = EDGE_CURVE('',#578,#629,#637,.T.);+#637 = CIRCLE('',#638,2.E-02);+#638 = AXIS2_PLACEMENT_3D('',#639,#640,#641);+#639 = CARTESIAN_POINT('',(0.3,-0.23,0.48));+#640 = DIRECTION('',(-1.,0.,0.));+#641 = DIRECTION('',(0.,0.,1.));+#642 = FACE_BOUND('',#643,.F.);+#643 = EDGE_LOOP('',(#644,#645,#646,#647,#648,#649,#650,#651));+#644 = ORIENTED_EDGE('',*,*,#388,.F.);+#645 = ORIENTED_EDGE('',*,*,#558,.T.);+#646 = ORIENTED_EDGE('',*,*,#535,.T.);+#647 = ORIENTED_EDGE('',*,*,#518,.T.);+#648 = ORIENTED_EDGE('',*,*,#493,.F.);+#649 = ORIENTED_EDGE('',*,*,#460,.F.);+#650 = ORIENTED_EDGE('',*,*,#437,.T.);+#651 = ORIENTED_EDGE('',*,*,#413,.F.);+#652 = PLANE('',#653);+#653 = AXIS2_PLACEMENT_3D('',#654,#655,#656);+#654 = CARTESIAN_POINT('',(0.3,-0.25,0.));+#655 = DIRECTION('',(1.,0.,0.));+#656 = DIRECTION('',(0.,0.,1.));+#657 = ADVANCED_FACE('',(#658),#683,.F.);+#658 = FACE_BOUND('',#659,.F.);+#659 = EDGE_LOOP('',(#660,#670,#676,#677));+#660 = ORIENTED_EDGE('',*,*,#661,.F.);+#661 = EDGE_CURVE('',#662,#664,#666,.T.);+#662 = VERTEX_POINT('',#663);+#663 = CARTESIAN_POINT('',(0.5,-0.25,2.E-02));+#664 = VERTEX_POINT('',#665);+#665 = CARTESIAN_POINT('',(0.5,-0.25,0.48));+#666 = LINE('',#667,#668);+#667 = CARTESIAN_POINT('',(0.5,-0.25,0.));+#668 = VECTOR('',#669,1.);+#669 = DIRECTION('',(0.,0.,1.));+#670 = ORIENTED_EDGE('',*,*,#671,.F.);+#671 = EDGE_CURVE('',#576,#662,#672,.T.);+#672 = LINE('',#673,#674);+#673 = CARTESIAN_POINT('',(0.3,-0.25,2.E-02));+#674 = VECTOR('',#675,1.);+#675 = DIRECTION('',(1.,0.,0.));+#676 = ORIENTED_EDGE('',*,*,#575,.T.);+#677 = ORIENTED_EDGE('',*,*,#678,.T.);+#678 = EDGE_CURVE('',#578,#664,#679,.T.);+#679 = LINE('',#680,#681);+#680 = CARTESIAN_POINT('',(0.3,-0.25,0.48));+#681 = VECTOR('',#682,1.);+#682 = DIRECTION('',(1.,0.,0.));+#683 = PLANE('',#684);+#684 = AXIS2_PLACEMENT_3D('',#685,#686,#687);+#685 = CARTESIAN_POINT('',(0.3,-0.25,0.));+#686 = DIRECTION('',(0.,1.,0.));+#687 = DIRECTION('',(0.,0.,1.));+#688 = ADVANCED_FACE('',(#689),#708,.T.);+#689 = FACE_BOUND('',#690,.T.);+#690 = EDGE_LOOP('',(#691,#692,#700,#707));+#691 = ORIENTED_EDGE('',*,*,#585,.T.);+#692 = ORIENTED_EDGE('',*,*,#693,.T.);+#693 = EDGE_CURVE('',#586,#694,#696,.T.);+#694 = VERTEX_POINT('',#695);+#695 = CARTESIAN_POINT('',(0.5,-0.23,0.));+#696 = LINE('',#697,#698);+#697 = CARTESIAN_POINT('',(0.3,-0.23,0.));+#698 = VECTOR('',#699,1.);+#699 = DIRECTION('',(1.,0.,0.));+#700 = ORIENTED_EDGE('',*,*,#701,.F.);+#701 = EDGE_CURVE('',#662,#694,#702,.T.);+#702 = CIRCLE('',#703,2.E-02);+#703 = AXIS2_PLACEMENT_3D('',#704,#705,#706);+#704 = CARTESIAN_POINT('',(0.5,-0.23,2.E-02));+#705 = DIRECTION('',(1.,0.,-0.));+#706 = DIRECTION('',(0.,0.,1.));+#707 = ORIENTED_EDGE('',*,*,#671,.F.);+#708 = CYLINDRICAL_SURFACE('',#709,2.E-02);+#709 = AXIS2_PLACEMENT_3D('',#710,#711,#712);+#710 = CARTESIAN_POINT('',(0.3,-0.23,2.E-02));+#711 = DIRECTION('',(1.,0.,0.));+#712 = DIRECTION('',(0.,-1.,0.));+#713 = ADVANCED_FACE('',(#714),#733,.T.);+#714 = FACE_BOUND('',#715,.F.);+#715 = EDGE_LOOP('',(#716,#717,#725,#732));+#716 = ORIENTED_EDGE('',*,*,#636,.T.);+#717 = ORIENTED_EDGE('',*,*,#718,.T.);+#718 = EDGE_CURVE('',#629,#719,#721,.T.);+#719 = VERTEX_POINT('',#720);+#720 = CARTESIAN_POINT('',(0.5,-0.23,0.5));+#721 = LINE('',#722,#723);+#722 = CARTESIAN_POINT('',(0.3,-0.23,0.5));+#723 = VECTOR('',#724,1.);+#724 = DIRECTION('',(1.,0.,0.));+#725 = ORIENTED_EDGE('',*,*,#726,.F.);+#726 = EDGE_CURVE('',#664,#719,#727,.T.);+#727 = CIRCLE('',#728,2.E-02);+#728 = AXIS2_PLACEMENT_3D('',#729,#730,#731);+#729 = CARTESIAN_POINT('',(0.5,-0.23,0.48));+#730 = DIRECTION('',(-1.,0.,0.));+#731 = DIRECTION('',(0.,0.,1.));+#732 = ORIENTED_EDGE('',*,*,#678,.F.);+#733 = CYLINDRICAL_SURFACE('',#734,2.E-02);+#734 = AXIS2_PLACEMENT_3D('',#735,#736,#737);+#735 = CARTESIAN_POINT('',(0.3,-0.23,0.48));+#736 = DIRECTION('',(1.,0.,0.));+#737 = DIRECTION('',(0.,-1.,0.));+#738 = ADVANCED_FACE('',(#739),#757,.F.);+#739 = FACE_BOUND('',#740,.F.);+#740 = EDGE_LOOP('',(#741,#742,#743,#751));+#741 = ORIENTED_EDGE('',*,*,#594,.F.);+#742 = ORIENTED_EDGE('',*,*,#693,.T.);+#743 = ORIENTED_EDGE('',*,*,#744,.T.);+#744 = EDGE_CURVE('',#694,#745,#747,.T.);+#745 = VERTEX_POINT('',#746);+#746 = CARTESIAN_POINT('',(0.5,0.23,0.));+#747 = LINE('',#748,#749);+#748 = CARTESIAN_POINT('',(0.5,-0.25,0.));+#749 = VECTOR('',#750,1.);+#750 = DIRECTION('',(0.,1.,0.));+#751 = ORIENTED_EDGE('',*,*,#752,.F.);+#752 = EDGE_CURVE('',#595,#745,#753,.T.);+#753 = LINE('',#754,#755);+#754 = CARTESIAN_POINT('',(0.3,0.23,0.));+#755 = VECTOR('',#756,1.);+#756 = DIRECTION('',(1.,0.,0.));+#757 = PLANE('',#758);+#758 = AXIS2_PLACEMENT_3D('',#759,#760,#761);+#759 = CARTESIAN_POINT('',(0.3,-0.25,0.));+#760 = DIRECTION('',(0.,0.,1.));+#761 = DIRECTION('',(1.,0.,0.));+#762 = ADVANCED_FACE('',(#763),#781,.T.);+#763 = FACE_BOUND('',#764,.T.);+#764 = EDGE_LOOP('',(#765,#766,#767,#775));+#765 = ORIENTED_EDGE('',*,*,#628,.F.);+#766 = ORIENTED_EDGE('',*,*,#718,.T.);+#767 = ORIENTED_EDGE('',*,*,#768,.T.);+#768 = EDGE_CURVE('',#719,#769,#771,.T.);+#769 = VERTEX_POINT('',#770);+#770 = CARTESIAN_POINT('',(0.5,0.23,0.5));+#771 = LINE('',#772,#773);+#772 = CARTESIAN_POINT('',(0.5,-0.25,0.5));+#773 = VECTOR('',#774,1.);+#774 = DIRECTION('',(0.,1.,0.));+#775 = ORIENTED_EDGE('',*,*,#776,.F.);+#776 = EDGE_CURVE('',#620,#769,#777,.T.);+#777 = LINE('',#778,#779);+#778 = CARTESIAN_POINT('',(0.3,0.23,0.5));+#779 = VECTOR('',#780,1.);+#780 = DIRECTION('',(1.,0.,0.));+#781 = PLANE('',#782);+#782 = AXIS2_PLACEMENT_3D('',#783,#784,#785);+#783 = CARTESIAN_POINT('',(0.3,-0.25,0.5));+#784 = DIRECTION('',(0.,0.,1.));+#785 = DIRECTION('',(1.,0.,0.));+#786 = ADVANCED_FACE('',(#787),#806,.T.);+#787 = FACE_BOUND('',#788,.F.);+#788 = EDGE_LOOP('',(#789,#790,#791,#800));+#789 = ORIENTED_EDGE('',*,*,#602,.T.);+#790 = ORIENTED_EDGE('',*,*,#752,.T.);+#791 = ORIENTED_EDGE('',*,*,#792,.F.);+#792 = EDGE_CURVE('',#793,#745,#795,.T.);+#793 = VERTEX_POINT('',#794);+#794 = CARTESIAN_POINT('',(0.5,0.25,2.E-02));+#795 = CIRCLE('',#796,2.E-02);+#796 = AXIS2_PLACEMENT_3D('',#797,#798,#799);+#797 = CARTESIAN_POINT('',(0.5,0.23,2.E-02));+#798 = DIRECTION('',(-1.,0.,0.));+#799 = DIRECTION('',(0.,0.,1.));+#800 = ORIENTED_EDGE('',*,*,#801,.F.);+#801 = EDGE_CURVE('',#603,#793,#802,.T.);+#802 = LINE('',#803,#804);+#803 = CARTESIAN_POINT('',(0.3,0.25,2.E-02));+#804 = VECTOR('',#805,1.);+#805 = DIRECTION('',(1.,0.,0.));+#806 = CYLINDRICAL_SURFACE('',#807,2.E-02);+#807 = AXIS2_PLACEMENT_3D('',#808,#809,#810);+#808 = CARTESIAN_POINT('',(0.3,0.23,2.E-02));+#809 = DIRECTION('',(1.,0.,0.));+#810 = DIRECTION('',(0.,1.,0.));+#811 = ADVANCED_FACE('',(#812),#831,.T.);+#812 = FACE_BOUND('',#813,.T.);+#813 = EDGE_LOOP('',(#814,#815,#816,#825));+#814 = ORIENTED_EDGE('',*,*,#619,.T.);+#815 = ORIENTED_EDGE('',*,*,#776,.T.);+#816 = ORIENTED_EDGE('',*,*,#817,.F.);+#817 = EDGE_CURVE('',#818,#769,#820,.T.);+#818 = VERTEX_POINT('',#819);+#819 = CARTESIAN_POINT('',(0.5,0.25,0.48));+#820 = CIRCLE('',#821,2.E-02);+#821 = AXIS2_PLACEMENT_3D('',#822,#823,#824);+#822 = CARTESIAN_POINT('',(0.5,0.23,0.48));+#823 = DIRECTION('',(1.,0.,-0.));+#824 = DIRECTION('',(0.,0.,1.));+#825 = ORIENTED_EDGE('',*,*,#826,.F.);+#826 = EDGE_CURVE('',#612,#818,#827,.T.);+#827 = LINE('',#828,#829);+#828 = CARTESIAN_POINT('',(0.3,0.25,0.48));+#829 = VECTOR('',#830,1.);+#830 = DIRECTION('',(1.,0.,0.));+#831 = CYLINDRICAL_SURFACE('',#832,2.E-02);+#832 = AXIS2_PLACEMENT_3D('',#833,#834,#835);+#833 = CARTESIAN_POINT('',(0.3,0.23,0.48));+#834 = DIRECTION('',(1.,0.,0.));+#835 = DIRECTION('',(0.,1.,0.));+#836 = ADVANCED_FACE('',(#837),#848,.T.);+#837 = FACE_BOUND('',#838,.T.);+#838 = EDGE_LOOP('',(#839,#845,#846,#847));+#839 = ORIENTED_EDGE('',*,*,#840,.F.);+#840 = EDGE_CURVE('',#793,#818,#841,.T.);+#841 = LINE('',#842,#843);+#842 = CARTESIAN_POINT('',(0.5,0.25,0.));+#843 = VECTOR('',#844,1.);+#844 = DIRECTION('',(0.,0.,1.));+#845 = ORIENTED_EDGE('',*,*,#801,.F.);+#846 = ORIENTED_EDGE('',*,*,#611,.T.);+#847 = ORIENTED_EDGE('',*,*,#826,.T.);+#848 = PLANE('',#849);+#849 = AXIS2_PLACEMENT_3D('',#850,#851,#852);+#850 = CARTESIAN_POINT('',(0.3,0.25,0.));+#851 = DIRECTION('',(0.,1.,0.));+#852 = DIRECTION('',(0.,0.,1.));+#853 = ADVANCED_FACE('',(#854),#864,.T.);+#854 = FACE_BOUND('',#855,.T.);+#855 = EDGE_LOOP('',(#856,#857,#858,#859,#860,#861,#862,#863));+#856 = ORIENTED_EDGE('',*,*,#661,.F.);+#857 = ORIENTED_EDGE('',*,*,#701,.T.);+#858 = ORIENTED_EDGE('',*,*,#744,.T.);+#859 = ORIENTED_EDGE('',*,*,#792,.F.);+#860 = ORIENTED_EDGE('',*,*,#840,.T.);+#861 = ORIENTED_EDGE('',*,*,#817,.T.);+#862 = ORIENTED_EDGE('',*,*,#768,.F.);+#863 = ORIENTED_EDGE('',*,*,#726,.F.);+#864 = PLANE('',#865);+#865 = AXIS2_PLACEMENT_3D('',#866,#867,#868);+#866 = CARTESIAN_POINT('',(0.5,-0.25,0.));+#867 = DIRECTION('',(1.,0.,0.));+#868 = DIRECTION('',(0.,0.,1.));+#869 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3)+GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#873)) GLOBAL_UNIT_ASSIGNED_CONTEXT+((#870,#871,#872)) REPRESENTATION_CONTEXT('Context #1',+'3D Context with UNIT and UNCERTAINTY') );+#870 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) );+#871 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) );+#872 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() );+#873 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#870,+'distance_accuracy_value','confusion accuracy');+#874 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#7));+#875 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#876,+#884,#891,#898,#905,#912,#919,#926,#933,#940,#947,#955,#962,#969,+#976,#983,#990,#997,#1004,#1011,#1018,#1025,#1032,#1039,#1046,#1053,+#1060,#1067),#869);+#876 = STYLED_ITEM('color',(#877),#17);+#877 = PRESENTATION_STYLE_ASSIGNMENT((#878));+#878 = SURFACE_STYLE_USAGE(.BOTH.,#879);+#879 = SURFACE_SIDE_STYLE('',(#880));+#880 = SURFACE_STYLE_FILL_AREA(#881);+#881 = FILL_AREA_STYLE('',(#882));+#882 = FILL_AREA_STYLE_COLOUR('',#883);+#883 = COLOUR_RGB('',0.824000000954,0.819999992847,0.78100001812);+#884 = STYLED_ITEM('color',(#885),#93);+#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('',#883);+#891 = STYLED_ITEM('color',(#892),#124);+#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('',#883);+#898 = STYLED_ITEM('color',(#899),#149);+#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('',#883);+#905 = STYLED_ITEM('color',(#906),#174);+#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('',#883);+#912 = STYLED_ITEM('color',(#913),#198);+#913 = PRESENTATION_STYLE_ASSIGNMENT((#914));+#914 = SURFACE_STYLE_USAGE(.BOTH.,#915);+#915 = SURFACE_SIDE_STYLE('',(#916));+#916 = SURFACE_STYLE_FILL_AREA(#917);+#917 = FILL_AREA_STYLE('',(#918));+#918 = FILL_AREA_STYLE_COLOUR('',#883);+#919 = STYLED_ITEM('color',(#920),#222);+#920 = PRESENTATION_STYLE_ASSIGNMENT((#921));+#921 = SURFACE_STYLE_USAGE(.BOTH.,#922);+#922 = SURFACE_SIDE_STYLE('',(#923));+#923 = SURFACE_STYLE_FILL_AREA(#924);+#924 = FILL_AREA_STYLE('',(#925));+#925 = FILL_AREA_STYLE_COLOUR('',#883);+#926 = STYLED_ITEM('color',(#927),#247);+#927 = PRESENTATION_STYLE_ASSIGNMENT((#928));+#928 = SURFACE_STYLE_USAGE(.BOTH.,#929);+#929 = SURFACE_SIDE_STYLE('',(#930));+#930 = SURFACE_STYLE_FILL_AREA(#931);+#931 = FILL_AREA_STYLE('',(#932));+#932 = FILL_AREA_STYLE_COLOUR('',#883);+#933 = STYLED_ITEM('color',(#934),#272);+#934 = PRESENTATION_STYLE_ASSIGNMENT((#935));+#935 = SURFACE_STYLE_USAGE(.BOTH.,#936);+#936 = SURFACE_SIDE_STYLE('',(#937));+#937 = SURFACE_STYLE_FILL_AREA(#938);+#938 = FILL_AREA_STYLE('',(#939));+#939 = FILL_AREA_STYLE_COLOUR('',#883);+#940 = STYLED_ITEM('color',(#941),#289);+#941 = PRESENTATION_STYLE_ASSIGNMENT((#942));+#942 = SURFACE_STYLE_USAGE(.BOTH.,#943);+#943 = SURFACE_SIDE_STYLE('',(#944));+#944 = SURFACE_STYLE_FILL_AREA(#945);+#945 = FILL_AREA_STYLE('',(#946));+#946 = FILL_AREA_STYLE_COLOUR('',#883);+#947 = STYLED_ITEM('color',(#948),#375);+#948 = PRESENTATION_STYLE_ASSIGNMENT((#949));+#949 = SURFACE_STYLE_USAGE(.BOTH.,#950);+#950 = SURFACE_SIDE_STYLE('',(#951));+#951 = SURFACE_STYLE_FILL_AREA(#952);+#952 = FILL_AREA_STYLE('',(#953));+#953 = FILL_AREA_STYLE_COLOUR('',#954);+#954 = COLOUR_RGB('',0.379000008106,0.270000010729,0.215000003576);+#955 = STYLED_ITEM('color',(#956),#407);+#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('',#954);+#962 = STYLED_ITEM('color',(#963),#431);+#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('',#954);+#969 = STYLED_ITEM('color',(#970),#456);+#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('',#954);+#976 = STYLED_ITEM('color',(#977),#480);+#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('',#954);+#983 = STYLED_ITEM('color',(#984),#505);+#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('',#954);+#990 = STYLED_ITEM('color',(#991),#529);+#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('',#954);+#997 = STYLED_ITEM('color',(#998),#554);+#998 = PRESENTATION_STYLE_ASSIGNMENT((#999));+#999 = SURFACE_STYLE_USAGE(.BOTH.,#1000);+#1000 = SURFACE_SIDE_STYLE('',(#1001));+#1001 = SURFACE_STYLE_FILL_AREA(#1002);+#1002 = FILL_AREA_STYLE('',(#1003));+#1003 = FILL_AREA_STYLE_COLOUR('',#954);+#1004 = STYLED_ITEM('color',(#1005),#571);+#1005 = PRESENTATION_STYLE_ASSIGNMENT((#1006));+#1006 = SURFACE_STYLE_USAGE(.BOTH.,#1007);+#1007 = SURFACE_SIDE_STYLE('',(#1008));+#1008 = SURFACE_STYLE_FILL_AREA(#1009);+#1009 = FILL_AREA_STYLE('',(#1010));+#1010 = FILL_AREA_STYLE_COLOUR('',#883);+#1011 = STYLED_ITEM('color',(#1012),#657);+#1012 = PRESENTATION_STYLE_ASSIGNMENT((#1013));+#1013 = SURFACE_STYLE_USAGE(.BOTH.,#1014);+#1014 = SURFACE_SIDE_STYLE('',(#1015));+#1015 = SURFACE_STYLE_FILL_AREA(#1016);+#1016 = FILL_AREA_STYLE('',(#1017));+#1017 = FILL_AREA_STYLE_COLOUR('',#883);+#1018 = STYLED_ITEM('color',(#1019),#688);+#1019 = PRESENTATION_STYLE_ASSIGNMENT((#1020));+#1020 = SURFACE_STYLE_USAGE(.BOTH.,#1021);+#1021 = SURFACE_SIDE_STYLE('',(#1022));+#1022 = SURFACE_STYLE_FILL_AREA(#1023);+#1023 = FILL_AREA_STYLE('',(#1024));+#1024 = FILL_AREA_STYLE_COLOUR('',#883);+#1025 = STYLED_ITEM('color',(#1026),#713);+#1026 = PRESENTATION_STYLE_ASSIGNMENT((#1027));+#1027 = SURFACE_STYLE_USAGE(.BOTH.,#1028);+#1028 = SURFACE_SIDE_STYLE('',(#1029));+#1029 = SURFACE_STYLE_FILL_AREA(#1030);+#1030 = FILL_AREA_STYLE('',(#1031));+#1031 = FILL_AREA_STYLE_COLOUR('',#883);+#1032 = STYLED_ITEM('color',(#1033),#738);+#1033 = PRESENTATION_STYLE_ASSIGNMENT((#1034));+#1034 = SURFACE_STYLE_USAGE(.BOTH.,#1035);+#1035 = SURFACE_SIDE_STYLE('',(#1036));+#1036 = SURFACE_STYLE_FILL_AREA(#1037);+#1037 = FILL_AREA_STYLE('',(#1038));+#1038 = FILL_AREA_STYLE_COLOUR('',#883);+#1039 = STYLED_ITEM('color',(#1040),#762);+#1040 = PRESENTATION_STYLE_ASSIGNMENT((#1041));+#1041 = SURFACE_STYLE_USAGE(.BOTH.,#1042);+#1042 = SURFACE_SIDE_STYLE('',(#1043));+#1043 = SURFACE_STYLE_FILL_AREA(#1044);+#1044 = FILL_AREA_STYLE('',(#1045));+#1045 = FILL_AREA_STYLE_COLOUR('',#883);+#1046 = STYLED_ITEM('color',(#1047),#786);+#1047 = PRESENTATION_STYLE_ASSIGNMENT((#1048));+#1048 = SURFACE_STYLE_USAGE(.BOTH.,#1049);+#1049 = SURFACE_SIDE_STYLE('',(#1050));+#1050 = SURFACE_STYLE_FILL_AREA(#1051);+#1051 = FILL_AREA_STYLE('',(#1052));+#1052 = FILL_AREA_STYLE_COLOUR('',#883);+#1053 = STYLED_ITEM('color',(#1054),#811);+#1054 = PRESENTATION_STYLE_ASSIGNMENT((#1055));+#1055 = SURFACE_STYLE_USAGE(.BOTH.,#1056);+#1056 = SURFACE_SIDE_STYLE('',(#1057));+#1057 = SURFACE_STYLE_FILL_AREA(#1058);+#1058 = FILL_AREA_STYLE('',(#1059));+#1059 = FILL_AREA_STYLE_COLOUR('',#883);+#1060 = STYLED_ITEM('color',(#1061),#836);+#1061 = PRESENTATION_STYLE_ASSIGNMENT((#1062));+#1062 = SURFACE_STYLE_USAGE(.BOTH.,#1063);+#1063 = SURFACE_SIDE_STYLE('',(#1064));+#1064 = SURFACE_STYLE_FILL_AREA(#1065);+#1065 = FILL_AREA_STYLE('',(#1066));+#1066 = FILL_AREA_STYLE_COLOUR('',#883);+#1067 = STYLED_ITEM('color',(#1068),#853);+#1068 = PRESENTATION_STYLE_ASSIGNMENT((#1069));+#1069 = SURFACE_STYLE_USAGE(.BOTH.,#1070);+#1070 = SURFACE_SIDE_STYLE('',(#1071));+#1071 = SURFACE_STYLE_FILL_AREA(#1072);+#1072 = FILL_AREA_STYLE('',(#1073));+#1073 = FILL_AREA_STYLE_COLOUR('',#883);+ENDSEC;+END-ISO-10303-21;
LICENSEadded+13@@ -0,0 +1,13 @@+GRM1555C1H100JA01D component page++Original Adom content on this page (README text, the KiCad symbol GRM1555C1H100JA01D.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:+- C_0402_1005Metric_GRM1555C1H100JA01D.kicad_mod and GRM1555C1H100JA01D.step (and the GLB and LOD files derived from it) 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 PDFs in docs/ are Murata documents, copyright of their publishers,+ included unchanged for reference.
README.md+117−2@@ -1,3 +1,118 @@-# GRM1555C1H100JA01D - Murata+# GRM1555C1H100JA01D -MLCC 10 pF +/-5 %, 50 V, C0G, 0402 (1005 metric)+Murata GRM1555C1H100JA01D: MLCC 10 pF +/-5 %, 50 V, C0G, 0402 (1005 metric).++::adom-verified{src="/adom/grm1555c1h100ja01d/render/verification.json"}++| Field | Value |+|---|---|+| Manufacturer | Murata Manufacturing |+| Manufacturer part number | GRM1555C1H100JA01D |+| Type | MLCC, Class 1 (C0G) |+| Value | 10 pF |+| Tolerance | +/-5 % (J) |+| Rated voltage | 50 V DC (1H) |+| Dielectric | C0G (EIA) / 5C, 0 +/-30 ppm/C |+| Operating temperature | -55 to 125 C |+| Package | 0402 (1005 metric) |+| Datasheet | [Murata reference sheet GRM1555C1H100JA01-01A, specifications as of Jun. 13, 2026](docs/grm1555c1h100ja01d-datasheet.pdf) |++## Key specifications++| Parameter | Value | Datasheet |+|---|---|---|+| Capacitance | 10 pF | p.2 Rated Value |+| Tolerance | +/-5 % (code J) | p.2 Rated Value |+| Rated voltage | 50 V DC (code 1H) | p.2 Rated Value |+| Temperature characteristic | C0G (EIA), Murata code 5C: 0 +/-30 ppm/C (25 to 125 C, ref. 25 C) | p.2 Rated Value |+| Operating temperature | -55 to 125 C | p.2 Rated Value |+| Q at 1 MHz | Q >= 400 + 20C, C in pF (600 or more for 10 pF) | p.3 item 7 |+| Insulation resistance | more than 10000 MOhm at rated voltage | p.3 item 5 |+| Mounting | flow or reflow | p.2 Rated Value |+| Size | L 1.0 +/-0.05, W 0.5 +/-0.05, T 0.5 +/-0.05, e 0.15 to 0.35, g 0.3 min (mm) | p.2 Type & Dimension |+| Packaging (suffix D) | 180 mm reel, paper tape W8P2, 10000 pcs per reel | p.2 Package |++All page numbers refer to the PDF in [docs/](docs/grm1555c1h100ja01d-datasheet.pdf) unless stated otherwise.++## Ordering++| Distributor | Part number | Stock seen 2026-10-21 |+|---|---|---|+| Mouser | [81-GRM1555C1H100JA1D](https://www.mouser.com/ProductDetail/Murata-Electronics/GRM1555C1H100JA01D?qs=to8XolpOzrNUIL4CZ%252BkORA%3D%3D) | 580,872 |+| DigiKey | [490-5921-2-ND](https://www.digikey.com/en/products/detail/murata-electronics/GRM1555C1H100JA01D/3661907) | 0 |+| LCSC / JLCPCB | [C76946](https://www.lcsc.com/product-detail/C76946.html) | 315,188 |++Stock figures are a snapshot from the Adom parts search on 2026-10-21; check the distributor before ordering.++## Manufacturer and resources++| Resource | Link |+|---|---|+| Product page | https://pim.murata.com/en-us/pim/details/?partNum=GRM1555C1H100JA01%23 |+| Datasheet | Murata reference sheet GRM1555C1H100JA01-01A, specifications as of Jun. 13, 2026, [PDF](docs/grm1555c1h100ja01d-datasheet.pdf) ([source](https://search.murata.co.jp/Ceramy/image/img/A01X/G101/ENG/GRM1555C1H100JA01-01A.pdf)) |++## Pins++| Pin | Function |+|---|---|+| 1 | terminal (non-polar) |+| 2 | terminal (non-polar) |++A capacitor of this kind has no polarity and no pin 1 orientation: either terminal may face either way.++## Land pattern: KiCad footprint vs Murata++<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> Land pattern </sub></td>+<td>The footprint is KiCad's standard `C_0402_1005Metric`, and this guide lays its pads over the land pattern recommended by Murata, at true scale. The KiCad pads are a little larger than the maker asks for, and the guide shows by how much. Use it to decide whether to keep the KiCad pads or shrink them to the maker's numbers before layout.<br><br><a href="land-pattern/README.md">The comparison, with the numbers</a></td>+</tr>+</table>++## 3D model++No manufacturer STEP could be downloaded for this exact part number (Murata's CAD downloads are behind its+interactive product search), so the page uses KiCad's library model for the package, `C_0402_1005Metric.step`, with its bytes+unchanged, renamed `GRM1555C1H100JA01D.step`. It was checked against the datasheet table before use (next section). The GLB for the+page viewer was made from it with `step2glb convert`. The Murata reference sheet specifies no part marking: none of its 33 pages has a marking section, and the p.2 dimension sketch shows a plain body (GRM1555C1H100JA01-01A, all 33 pages searched; p.2), so the model shows a plain body.++::adom-models{src="/adom/grm1555c1h100ja01d/render/models.json"}++## Model checked against the datasheet++The 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.500 mm (datasheet 0.45 to 0.55), e (terminal band), top 0.200 mm (datasheet 0.15 to 0.35), e (terminal band), bottom 0.200 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.++++Source: Murata reference sheet GRM1555C1H100JA01-01A, specifications as of Jun. 13, 2026, p.2 'Type & Dimension', size code 1005M(0402): L 1.0 +/-0.05, W 0.5 +/-0.05, T 0.5 +/-0.05, e 0.15 to 0.35, g 0.3 min (mm).++## Board levels of detail++Clean board-use GLBs (no footprint pads, outlines, labels or silkscreen; no marking) 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/grm1555c1h100ja01d/render/lod/manifest.json"}++## CAD files++| File | What it is |+|---|---|+| `GRM1555C1H100JA01D.kicad_sym` | KiCad symbol (standard capacitor graphic) with MPN, Manufacturer, Mouser, DigiKey and LCSC fields |+| `C_0402_1005Metric_GRM1555C1H100JA01D.kicad_mod` | KiCad footprint (KiCad library `C_0402_1005Metric`, renamed; model path `${KIPRJMOD}/GRM1555C1H100JA01D.step`) |+| `GRM1555C1H100JA01D.step` | 3D package model, STEP |+| `package-reference.glb` | 3D package model, GLB |+| `lod/` | board-use GLBs in four levels of detail, with previews and manifest |++## Sources and license++- Murata: Murata reference sheet GRM1555C1H100JA01-01A, specifications as of Jun. 13, 2026 (https://search.murata.co.jp/Ceramy/image/img/A01X/G101/ENG/GRM1555C1H100JA01-01A.pdf)+- KiCad libraries: [Capacitor_SMD.pretty/C_0402_1005Metric.kicad_mod](https://gitlab.com/kicad/libraries/kicad-footprints/-/blob/master/Capacitor_SMD.pretty/C_0402_1005Metric.kicad_mod), [Capacitor_SMD.3dshapes/C_0402_1005Metric.step](https://gitlab.com/kicad/libraries/kicad-packages3D/-/blob/master/Capacitor_SMD.3dshapes/C_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 the publishers' 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 the maker's current datasheet for your design.
docs/grm1555c1h100ja01d-datasheet.pdfadded⋯ 1 unchanged line ⋯
docs/hero.pngadded⋯ 1 unchanged line ⋯
docs/models/package-reference-step.pngadded⋯ 1 unchanged line ⋯
docs/verify/grm1555c1h100ja01d-check.jsonadded+51@@ -0,0 +1,51 @@+{+ "step": "GRM1555C1H100JA01D.step",+ "bbox_mm": [+ -0.5,+ 0.5,+ -0.25,+ 0.25,+ 0.0,+ 0.5+ ],+ "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.5,+ "datasheet_min": 0.45,+ "datasheet_max": 0.55,+ "pass": true+ },+ {+ "dim": "e (terminal band), top",+ "model_mm": 0.2,+ "datasheet_min": 0.15,+ "datasheet_max": 0.35,+ "pass": true+ },+ {+ "dim": "e (terminal band), bottom",+ "model_mm": 0.2,+ "datasheet_min": 0.15,+ "datasheet_max": 0.35,+ "pass": true+ }+ ],+ "z_up_seated_centred": true,+ "long_axis_x": true,+ "all_pass": true+}
docs/verify/grm1555c1h100ja01d-overlay.pngadded⋯ 1 unchanged line ⋯
land-pattern/README.mdadded+32@@ -0,0 +1,32 @@+# Land pattern check: GRM1555C1H100JA01D++The footprint on this page is KiCad's standard library footprint `Capacitor_SMD:C_0402_1005Metric`, renamed to+`C_0402_1005Metric_GRM1555C1H100JA01D` so it can sit beside other parts in one library folder. The copper is unchanged.+This page compares those pads with the land pattern recommended by Murata.++++Grey is the part body at its datasheet nominal size, teal is the KiCad copper, the dashed amber outline is the maker's+land (middle of its printed range, or its printed nominal), and the amber bands show where the maker allows the inner+and outer pad edges when it prints a range.++## Numbers++| Dimension | KiCad footprint | Maker's range | Result |+|---|---|---|---|+| gap between lands | 0.40 mm | 0.30 to 0.50 mm | inside |+| land length | 0.56 mm | 0.35 to 0.45 mm | outside by +0.11 mm |+| land width | 0.62 mm | 0.40 to 0.60 mm | outside by +0.02 mm |+| overall length (a + 2b, derived) | 1.52 mm | 1.00 to 1.40 mm | outside by +0.12 mm |++Maker's letters: a = gap between lands, b = land length, c = land width.++Source: Murata reference sheet, p.27 'Land Dimensions', Table 2 Reflow Soldering Method, GRM 15, 1.0x0.5 (within +/-0.10).++## Result++The KiCad pads are larger than the maker's recommendation: land length by +0.11 mm, land width by +0.02 mm, overall length (a + 2b, derived) by +0.12 mm. The gap between the pads is inside the range. KiCad's footprint is generated to IPC-7351 nominal density (its own description says so), not to this maker's table. A design that wants the maker's land should shrink the pads to the numbers in the table.++KiCad pad centres are at +/-0.48 mm, pad size 0.56 x 0.62 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 the maker's table.
land-pattern/land-check.jsonadded+1@@ -0,0 +1 @@+{"footprint": "C_0402_1005Metric_GRM1555C1H100JA01D.kicad_mod", "kicad_library_footprint": "C_0402_1005Metric", "kicad": {"gap": 0.4, "len": 0.56, "wid": 0.62, "overall": 1.52}, "maker_reference": {"gap": 0.4, "len": 0.4, "wid": 0.5, "overall": 1.2}, "maker_source": "Murata reference sheet, p.27 'Land Dimensions', Table 2 Reflow Soldering Method, GRM 15, 1.0x0.5 (within +/-0.10)", "maker_letters": "a = gap between lands, b = land length, c = land width", "rows": [{"dim": "gap between lands", "kicad_mm": 0.4, "maker_min": 0.3, "maker_max": 0.5, "within": true, "outside_by_mm": 0}, {"dim": "land length", "kicad_mm": 0.56, "maker_min": 0.35, "maker_max": 0.45, "within": false, "outside_by_mm": 0.11}, {"dim": "land width", "kicad_mm": 0.62, "maker_min": 0.4, "maker_max": 0.6, "within": false, "outside_by_mm": 0.02}, {"dim": "overall length (a + 2b, derived)", "kicad_mm": 1.52, "maker_min": 1.0, "maker_max": 1.4, "within": false, "outside_by_mm": 0.12}], "all_within": false}
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": "GRM1555C1H100JA01D",+ "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 (GRM1555C1H100JA01-01A, all 33 pages searched; p.2)",+ "source": {+ "path": "GRM1555C1H100JA01D.step",+ "sha256": "03e44c4b2b727b8d4b6b1fd598cbd12dd5e614f1dfeefa96a92a07e3a3b312a2"+ },+ "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": "52968497c1f68b0fb42890708303cc9b630c3c8789948a1738ae8684bf1c0a84",+ "sizeBytes": 68412,+ "decodedBufferBytes": 66504,+ "triangles": 1580,+ "primitives": 2,+ "bounds": {+ "min": [+ -0.0005,+ -0.00025,+ 0.0+ ],+ "max": [+ 0.0005,+ 0.00025,+ 0.0005+ ]+ },+ "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": "81bd34c0b5d36898cad568fe7ec25ec6881c354cd5678749ecf65277066eb2ed",+ "sizeBytes": 8635,+ "width": 400,+ "height": 300,+ "view": "iso",+ "sourceLevelSha256": "52968497c1f68b0fb42890708303cc9b630c3c8789948a1738ae8684bf1c0a84"+ }+ },+ {+ "level": "medium",+ "path": "lod/medium.glb",+ "sha256": "ce29062d9fe0d9a8f3e8d109e4da0c84c50551c7cebc3c793a4747752550fa6c",+ "sizeBytes": 22040,+ "decodedBufferBytes": 20136,+ "triangles": 476,+ "primitives": 2,+ "bounds": {+ "min": [+ -0.0005,+ -0.00025,+ 0.0+ ],+ "max": [+ 0.0005,+ 0.00025,+ 0.0005+ ]+ },+ "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": "e71ddd5e4d23bfb20d68d259e27eb26a6710554657a4c63437f8de96d049350d",+ "sizeBytes": 8478,+ "width": 400,+ "height": 300,+ "view": "iso",+ "sourceLevelSha256": "ce29062d9fe0d9a8f3e8d109e4da0c84c50551c7cebc3c793a4747752550fa6c"+ }+ },+ {+ "level": "low",+ "path": "lod/low.glb",+ "sha256": "bb49e87098dfd14d5aa07dd81462f772a4161881baef1fd917780ba837d5109b",+ "sizeBytes": 11952,+ "decodedBufferBytes": 10056,+ "triangles": 236,+ "primitives": 2,+ "bounds": {+ "min": [+ -0.0005,+ -0.00025,+ 0.0+ ],+ "max": [+ 0.0005,+ 0.00025,+ 0.0005+ ]+ },+ "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": "c46cde4b30d0d030e0ee435556541e215155c825bcdcf5fd2344687cc83c49f5",+ "sizeBytes": 8551,+ "width": 400,+ "height": 300,+ "view": "iso",+ "sourceLevelSha256": "bb49e87098dfd14d5aa07dd81462f772a4161881baef1fd917780ba837d5109b"+ }+ },+ {+ "level": "super-low",+ "path": "lod/super-low.glb",+ "sha256": "88db0ae37933c95255ea7b5a3de8ae00f2622caf453f2854b8df8dfd476cb372",+ "sizeBytes": 3828,+ "decodedBufferBytes": 1944,+ "triangles": 36,+ "primitives": 2,+ "bounds": {+ "min": [+ -0.0005,+ -0.00025,+ 0.0+ ],+ "max": [+ 0.0005,+ 0.00025,+ 0.0005+ ]+ },+ "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": "e9c1f448878cdfb09bb08dd62222cb224dab0177841ff7f459af55a1eca73eb3",+ "sizeBytes": 7245,+ "width": 400,+ "height": 300,+ "view": "iso",+ "sourceLevelSha256": "88db0ae37933c95255ea7b5a3de8ae00f2622caf453f2854b8df8dfd476cb372"+ }+ }+ ],+ "hints": [+ "All four levels share pose and units; super-low is boxes per material group, chosen for board overviews."+ ]+}
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+125@@ -0,0 +1,125 @@+{+ "schema": "adom/models@1",+ "part": "GRM1555C1H100JA01D",+ "models": [+ {+ "path": "GRM1555C1H100JA01D.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 Capacitor_SMD.3dshapes/C_0402_1005Metric.step (CC-BY-SA 4.0 with the KiCad library exception)",+ "sha256": "03e44c4b2b727b8d4b6b1fd598cbd12dd5e614f1dfeefa96a92a07e3a3b312a2",+ "git_blob": "a5725e143e2db0a0a1e499bd95c9c9da94a4f82b",+ "bytes": 43502,+ "thumb": "docs/models/package-reference-step.png"+ },+ {+ "path": "package-reference.glb",+ "format": "glb",+ "title": "Package model (GLB)",+ "status": "current",+ "slot": "model_3d",+ "variant": "plain",+ "role": "derived",+ "use": [+ "render"+ ],+ "marking": null,+ "derived_from": "GRM1555C1H100JA01D.step",+ "unique": "The same model for the page viewer (step2glb)",+ "source": "KiCad packages3D Capacitor_SMD.3dshapes/C_0402_1005Metric.step (CC-BY-SA 4.0 with the KiCad library exception)",+ "sha256": "100935c5c0d6f20a6c9bdfb6386f874dc8a4457bf0e4f3ace69f1ab090100773",+ "git_blob": "be1969cc5b4bde9fe0ba1de99674dbb12e76fd76",+ "bytes": 15944+ },+ {+ "path": "lod/high.glb",+ "format": "glb",+ "title": "Board LOD, high",+ "status": "current",+ "variant": "lod",+ "role": "derived",+ "use": [+ "board-insertion",+ "render"+ ],+ "marking": null,+ "derived_from": "GRM1555C1H100JA01D.step",+ "unique": "high detail for board and scaffold viewers: 1580 triangles, 2 primitives",+ "thumb": "lod/high.png",+ "source": "KiCad packages3D Capacitor_SMD.3dshapes/C_0402_1005Metric.step (CC-BY-SA 4.0 with the KiCad library exception)",+ "sha256": "52968497c1f68b0fb42890708303cc9b630c3c8789948a1738ae8684bf1c0a84",+ "git_blob": "e13e56fe0707c8bbe087f8fc8a3d1abf8af68321",+ "bytes": 68412+ },+ {+ "path": "lod/medium.glb",+ "format": "glb",+ "title": "Board LOD, medium",+ "status": "current",+ "variant": "lod",+ "role": "derived",+ "use": [+ "board-insertion",+ "render"+ ],+ "marking": null,+ "derived_from": "GRM1555C1H100JA01D.step",+ "unique": "medium detail for board and scaffold viewers: 476 triangles, 2 primitives",+ "thumb": "lod/medium.png",+ "source": "KiCad packages3D Capacitor_SMD.3dshapes/C_0402_1005Metric.step (CC-BY-SA 4.0 with the KiCad library exception)",+ "sha256": "ce29062d9fe0d9a8f3e8d109e4da0c84c50551c7cebc3c793a4747752550fa6c",+ "git_blob": "202e697ab11b5fd2895ed9849f7df0d39477440d",+ "bytes": 22040+ },+ {+ "path": "lod/low.glb",+ "format": "glb",+ "title": "Board LOD, low",+ "status": "current",+ "variant": "lod",+ "role": "derived",+ "use": [+ "board-insertion",+ "render"+ ],+ "marking": null,+ "derived_from": "GRM1555C1H100JA01D.step",+ "unique": "low detail for board and scaffold viewers: 236 triangles, 2 primitives",+ "thumb": "lod/low.png",+ "source": "KiCad packages3D Capacitor_SMD.3dshapes/C_0402_1005Metric.step (CC-BY-SA 4.0 with the KiCad library exception)",+ "sha256": "bb49e87098dfd14d5aa07dd81462f772a4161881baef1fd917780ba837d5109b",+ "git_blob": "476f837e616804fcc3b4c5a556ffad5c4373c4db",+ "bytes": 11952+ },+ {+ "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": "GRM1555C1H100JA01D.step",+ "unique": "super-low detail for board and scaffold viewers: 36 triangles, 2 primitives",+ "thumb": "lod/super-low.png",+ "source": "KiCad packages3D Capacitor_SMD.3dshapes/C_0402_1005Metric.step (CC-BY-SA 4.0 with the KiCad library exception)",+ "sha256": "88db0ae37933c95255ea7b5a3de8ae00f2622caf453f2854b8df8dfd476cb372",+ "git_blob": "1eaa441b1bf73525b357929a38401bfebdaa39a8",+ "bytes": 3828+ }+ ],+ "updated": "2026-10-21"+}
package-reference.glbadded⋯ 1 unchanged line ⋯
package.jsonadded+10@@ -0,0 +1,10 @@+{+ "name": "grm1555c1h100ja01d",+ "title": "GRM1555C1H100JA01D - Murata",+ "version": "0.1.0",+ "description": "MLCC 10 pF +/-5 %, 50 V, C0G, 0402 (1005 metric)",+ "type": "hardware",+ "kind": "component",+ "license": "CC-BY-4.0",+ "files": []+}
provenance.jsonadded+123@@ -0,0 +1,123 @@+{+ "manufacturer_reference": "https://pim.murata.com/en-us/pim/details/?partNum=GRM1555C1H100JA01%23",+ "symbol_source": "Original, written for this page (standard capacitor graphic, non-polar). CC-BY-4.0.",+ "footprint_source": "KiCad standard library Capacitor_SMD:C_0402_1005Metric (CC-BY-SA 4.0 with the KiCad library exception); renamed C_0402_1005Metric -> C_0402_1005Metric_GRM1555C1H100JA01D, model path set to ${KIPRJMOD}/GRM1555C1H100JA01D.step; copper unchanged",+ "footprint_upstream_sha256": "0403382fc4583ed510b461b1fa4a36dfaec6f4c0d9b1a67e6b0027837a54e1b5",+ "footprint_upstream_url": "https://gitlab.com/kicad/libraries/kicad-footprints/-/raw/master/Capacitor_SMD.pretty/C_0402_1005Metric.kicad_mod",+ "package_source": "KiCad packages3D Capacitor_SMD.3dshapes/C_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/Capacitor_SMD.3dshapes/C_0402_1005Metric.step",+ "package_bytes_unchanged": true,+ "manufacturer_step": {+ "found": false,+ "searched": "2026-10-21",+ "note": "Murata publishes CAD through interactive product pages; no direct STEP download for GRM1555C1H100JA01D was reachable without a browser session, 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.",+ "frame": {+ "units": "mm (STEP), metres (GLB)",+ "up_axis": "Z",+ "seat_z": 0,+ "origin": "footprint origin",+ "transform": "none"+ },+ "glb": {+ "tool": "step2glb convert",+ "exit": 0,+ "stderr_tail": "Large file queued for async conversion (job bf9aca22412f8890). Polling...\nJob bf9aca22412f8890 complete (0s). Downloading GLB...\n"+ },+ "hero": {+ "tool": "step2glb thumbnail --width 800 --height 600 (iso)",+ "path": "docs/hero.png"+ },+ "datasheet": {+ "file": "docs/grm1555c1h100ja01d-datasheet.pdf",+ "sha256": "5f487d20c0b95ac37d981491d969c8061e7a6cd3976070d3165ce3aeb72964e1",+ "url": "https://search.murata.co.jp/Ceramy/image/img/A01X/G101/ENG/GRM1555C1H100JA01-01A.pdf",+ "title": "Murata reference sheet GRM1555C1H100JA01-01A, specifications as of Jun. 13, 2026",+ "retrieved": "2026-10-21"+ },+ "supporting_documents": [],+ "datasheet_check": {+ "overlay": "docs/verify/grm1555c1h100ja01d-overlay.png",+ "numbers": "docs/verify/grm1555c1h100ja01d-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": "Murata reference sheet, p.27 'Land Dimensions', Table 2 Reflow Soldering Method, GRM 15, 1.0x0.5 (within +/-0.10)",+ "result": "larger than maker"+ },+ "marking": {+ "real_marking": null,+ "statement": "The Murata reference sheet specifies no part marking: none of its 33 pages has a marking section, and the p.2 dimension sketch shows a plain body",+ "source": "GRM1555C1H100JA01-01A, all 33 pages searched; p.2"+ },+ "distributors": {+ "tool": "adom-parts-search search GRM1555C1H100JA01D",+ "date": "2026-10-21",+ "mouser": {+ "part": "81-GRM1555C1H100JA1D",+ "url": "https://www.mouser.com/ProductDetail/Murata-Electronics/GRM1555C1H100JA01D?qs=to8XolpOzrNUIL4CZ%252BkORA%3D%3D",+ "stock": 580872+ },+ "digikey": {+ "part": "490-5921-2-ND",+ "url": "https://www.digikey.com/en/products/detail/murata-electronics/GRM1555C1H100JA01D/3661907",+ "stock": 0+ },+ "lcsc": {+ "part": "C76946",+ "url": "https://www.lcsc.com/product-detail/C76946.html",+ "stock": 315188+ }+ },+ "lod": {+ "manifest": "lod/manifest.json",+ "generator": "provenance/tools/lod.py",+ "source_sha256": "03e44c4b2b727b8d4b6b1fd598cbd12dd5e614f1dfeefa96a92a07e3a3b312a2"+ },+ "tools_note": "lod.py, ortho.py and overlay_chip.py come from the GRM155R71C104KA88D component page; overlay_chip.py was extended to accept min/max ranges and a per-part scale. build.py, parts.py, landcheck.py and records.py built this page.",+ "files": {+ "GRM1555C1H100JA01D.step": "03e44c4b2b727b8d4b6b1fd598cbd12dd5e614f1dfeefa96a92a07e3a3b312a2",+ "verification.json": "fd6a59fdccf2a86c0d09628e81ba1d33781cc8940c41a096c11e7f4a46a50b8f",+ "C_0402_1005Metric_GRM1555C1H100JA01D.kicad_mod": "7d3a5d733b20030edb791087a797ee537e933caab513f11fac19b6d8ca7c1e9a",+ "package-reference.glb": "100935c5c0d6f20a6c9bdfb6386f874dc8a4457bf0e4f3ace69f1ab090100773",+ "package.json": "b9662d4f8778cdaddede7448a626bd840fa905233d13b08e40e8c75658e65830",+ "models.json": "3015b0f84a4d660b8f606d3568ba3a42fe5c5c9b4d4b985dafbf890b942c35c0",+ "LICENSE": "0e48c902e7649cb0b1e18bd8c4f3dae61a1637a513bf48b629f07639ab765943",+ "GRM1555C1H100JA01D.kicad_sym": "42887f3e919526d49186df88bed0ac019b83b011c4171c1880825cb950675b26",+ "page.json": "f73e59df1d70cdbf8f13ff1979ce4bfc58a53e9d9a46e9c4e36b17e534debdb4",+ "README.md": "307d3aca91bce2b754fc8edd35ac3bda37cd781d00f48748468ea2d4c047c49c",+ "provenance/tools/parts.py": "4133bd07a07abb533eacb08af360a92cf4b3c6c773d69f7d87c282a5d8289012",+ "provenance/tools/grm1555c1h100ja01d-overlay-spec.json": "fe8e29da9539a28fc7ae23232e507900fe5780ff7eb855e4965d8f7adaa7038a",+ "provenance/tools/records.py": "e3b3a43d787f37e86ccd3afe233b1131be296f9a29564b2a8786118fda5bf236",+ "provenance/tools/landcheck.py": "a6141dcaa4992652e0caf3a7fdd51dcf8451fd630b7de7b873d1b910ae4a1d41",+ "provenance/tools/overlay_chip.py": "52617a63c9504e020e574ec63f39f518734032fcda7b14ad158e3f8907b31723",+ "provenance/tools/ortho.py": "c5a44e74fa447e1ece13190840c90d453cbb004f6c4608efb6e8cdb1ba2cbb6d",+ "provenance/tools/lod.py": "fc3eb9db56947d002d1dda328a6ee53032eae39f700521d00d18477f9915135c",+ "provenance/tools/build.py": "5b3b4c277ac86c7667a8cf73cf6b34bd198870968e33e11c68872c8571d45c31",+ "lod/low.png": "c46cde4b30d0d030e0ee435556541e215155c825bcdcf5fd2344687cc83c49f5",+ "lod/super-low.png": "e9c1f448878cdfb09bb08dd62222cb224dab0177841ff7f459af55a1eca73eb3",+ "lod/low.glb": "bb49e87098dfd14d5aa07dd81462f772a4161881baef1fd917780ba837d5109b",+ "lod/high.png": "81bd34c0b5d36898cad568fe7ec25ec6881c354cd5678749ecf65277066eb2ed",+ "lod/manifest.json": "3a625d01afe720b670e393850f7470c8e6cca0681bc68f985527a93fe9cbc0c1",+ "lod/super-low.glb": "88db0ae37933c95255ea7b5a3de8ae00f2622caf453f2854b8df8dfd476cb372",+ "lod/medium.glb": "ce29062d9fe0d9a8f3e8d109e4da0c84c50551c7cebc3c793a4747752550fa6c",+ "lod/high.glb": "52968497c1f68b0fb42890708303cc9b630c3c8789948a1738ae8684bf1c0a84",+ "lod/medium.png": "e71ddd5e4d23bfb20d68d259e27eb26a6710554657a4c63437f8de96d049350d",+ "docs/grm1555c1h100ja01d-datasheet.pdf": "5f487d20c0b95ac37d981491d969c8061e7a6cd3976070d3165ce3aeb72964e1",+ "docs/hero.png": "34a02e001910c6a31ed4200be9d459c17d0415447226703b3ce431e9bb86e6ef",+ "docs/models/package-reference-step.png": "a526b37a89a21d5bb34c5d9022e6690dfcf5c130a02bfbfd27fa926247c92369",+ "docs/verify/grm1555c1h100ja01d-overlay.png": "a0579202752b468dd7c688b603cd0aed07e4296b739a822dc840aa88bc5796ef",+ "docs/verify/grm1555c1h100ja01d-check.json": "bd6dedcb746bd851a9c06ca3a69e346f3ada98fcff6e85371bd5a7fdd94dd426",+ "land-pattern/land-check.json": "ba9881d13b891954106d96d585c993567508aebaa89c0da1cd9defc704f8ae1e",+ "land-pattern/land-pattern-icon.png": "52f4491d18e1a10a65cb50ef1a08bbd0391c6d9bdb930cbd2b68f9b066921eb0",+ "land-pattern/land-pattern.png": "62ea76a114e142b174c5f0dc9f8e819022c360493188094c12d3ddf1021bce03",+ "land-pattern/README.md": "5598652505fcf047e7e32bfc7c5225c89650ef146d97213e161ad5061dcfd026"+ },+ "files_note": "provenance.json itself is not listed.",+ "built_by": "Claude (AI agent) for John Lauer",+ "date": "2026-10-21"+}
provenance/tools/build.pyadded+149@@ -0,0 +1,149 @@+"""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/passives5"+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", "lod", "provenance/tools", "land-pattern"):+ 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))+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 = 1.27+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 3.81 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 -3.81 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"):+ 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": "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)++# ---------- GLB (step2glb) ----------+glb_path = os.path.join(OUT, "package-reference.glb")+g = subprocess.run(["step2glb", "convert", step_path, "-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", step_path, "-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"), (800, 600))+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"), step_path, MPN, OUT, step_name], cwd=TOOLS)+man = json.load(open(os.path.join(OUT, "lod/manifest.json")))+man["source"]["path"] = step_name+man["purpose"] = "clean board-use component models: no footprint pads, outlines, labels or silkscreen; no marking (" + P["marking_src"] + ")"+for lv in man["levels"]:+ lv["detailVisibility"]["note"] = "no marking: the datasheet specifies none"+json.dump(man, open(os.path.join(OUT, "lod/manifest.json"), "w"), indent=1)++json.dump({"step": step_name, "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/grm1555c1h100ja01d-overlay-spec.jsonadded+39@@ -0,0 +1,39 @@+{+ "label": "GRM1555C1H100JA01D",+ "mpn": "GRM1555C1H100JA01D",+ "L": [+ 1.0,+ 0.05+ ],+ "W": [+ 0.5,+ 0.05+ ],+ "T": [+ 0.5,+ 0.05+ ],+ "band_top": [+ 0.15,+ 0.35+ ],+ "band_bot": [+ 0.15,+ 0.35+ ],+ "band_top_name": "e (terminal band), top",+ "band_bot_name": "e (terminal band), bottom",+ "source": "Murata GRM1555C1H100JA01-01A reference sheet p.2 'Type & Dimension' (1005M/0402)",+ "crops": [+ [+ "datasheet page render (m10p-02.png, 100 dpi)",+ [+ 60,+ 225,+ 760,+ 540+ ]+ ]+ ],+ "marking": "none specified (GRM1555C1H100JA01-01A, all 33 pages searched; p.2)"+}
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+170@@ -0,0 +1,170 @@+"""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)+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 = ((T[:, :, 0].min(1) < -1e-6) & (T[:, :, 0].max(1) > 1e-6)).any()+ 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)+ 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))+ 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+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 = tris+ 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, "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+229@@ -0,0 +1,229 @@+"""Catalog data for the five passive component pages (all values from the cited sources)."""++TODAY = "2026-10-21"++MURATA_LAND = {+ "source": "Murata reference sheet, p.27 'Land Dimensions', Table 2 Reflow Soldering Method, GRM 15, 1.0x0.5 (within +/-0.10)",+ "kind": "range",+ "gap_a": [0.30, 0.50], "len_b": [0.35, 0.45], "wid_c": [0.40, 0.60],+ "letters": "a = gap between lands, b = land length, c = land width",+}++PARTS = [+ {+ "slug": "grm1555c1h100ja01d", "mpn": "GRM1555C1H100JA01D", "mfr": "Murata",+ "mfr_full": "Murata Manufacturing", "source_slug": "murata",+ "kind": "C", "category": "Capacitor", "subcategory": "MLCC, Class 1 (C0G)",+ "value_sym": "10pF", "value": "10 pF", "tol": "+/-5 % (J)", "voltage": "50 V DC (1H)",+ "dielectric": "C0G (EIA), temperature code 5C: 0 +/-30 ppm/C over 25 to 125 C",+ "rating_row": ("Dielectric", "C0G (EIA) / 5C, 0 +/-30 ppm/C"),+ "op_temp": "-55 to 125 C", "brief": "MLCC 10 pF +/-5 %, 50 V, C0G, 0402 (1005 metric)",+ "package": "0402 (1005 metric)", "fp": "C_0402_1005Metric", "fp_lib": "Capacitor_SMD",+ "body_mm": {"x_mm": 1.0, "y_mm": 0.5, "z_mm": 0.5},+ "product_url": "https://pim.murata.com/en-us/pim/details/?partNum=GRM1555C1H100JA01%23",+ "ds": {"file": "docs/grm1555c1h100ja01d-datasheet.pdf", "local": "ds-grm1555/GRM1555C1H100JA01-01A.pdf",+ "url": "https://search.murata.co.jp/Ceramy/image/img/A01X/G101/ENG/GRM1555C1H100JA01-01A.pdf",+ "title": "Murata reference sheet GRM1555C1H100JA01-01A, specifications as of Jun. 13, 2026", "pages": 33},+ "extra_docs": [],+ "spec_rows": [+ ("Capacitance", "10 pF", "p.2 Rated Value"),+ ("Tolerance", "+/-5 % (code J)", "p.2 Rated Value"),+ ("Rated voltage", "50 V DC (code 1H)", "p.2 Rated Value"),+ ("Temperature characteristic", "C0G (EIA), Murata code 5C: 0 +/-30 ppm/C (25 to 125 C, ref. 25 C)", "p.2 Rated Value"),+ ("Operating temperature", "-55 to 125 C", "p.2 Rated Value"),+ ("Q at 1 MHz", "Q >= 400 + 20C, C in pF (600 or more for 10 pF)", "p.3 item 7"),+ ("Insulation resistance", "more than 10000 MOhm at rated voltage", "p.3 item 5"),+ ("Mounting", "flow or reflow", "p.2 Rated Value"),+ ("Size", "L 1.0 +/-0.05, W 0.5 +/-0.05, T 0.5 +/-0.05, e 0.15 to 0.35, g 0.3 min (mm)", "p.2 Type & Dimension"),+ ("Packaging (suffix D)", "180 mm reel, paper tape W8P2, 10000 pcs per reel", "p.2 Package"),+ ],+ "overlay": {"L": [1.0, 0.05], "W": [0.5, 0.05], "T": [0.5, 0.05], "band_top": [0.15, 0.35], "band_bot": [0.15, 0.35],+ "band_top_name": "e (terminal band), top", "band_bot_name": "e (terminal band), bottom",+ "source": "Murata GRM1555C1H100JA01-01A reference sheet p.2 'Type & Dimension' (1005M/0402)",+ "crop": ["m10p-02.png", [60, 225, 760, 540]]},+ "dims_text": "p.2 'Type & Dimension', size code 1005M(0402): L 1.0 +/-0.05, W 0.5 +/-0.05, T 0.5 +/-0.05, e 0.15 to 0.35, g 0.3 min (mm)",+ "land": MURATA_LAND, "land_doc": None,+ "marking": "The Murata reference sheet specifies no part marking: none of its 33 pages has a marking section, and the p.2 dimension sketch shows a plain body",+ "marking_src": "GRM1555C1H100JA01-01A, all 33 pages searched; p.2",+ "dist": {"mouser": ("81-GRM1555C1H100JA1D", "https://www.mouser.com/ProductDetail/Murata-Electronics/GRM1555C1H100JA01D?qs=to8XolpOzrNUIL4CZ%252BkORA%3D%3D", 580872),+ "digikey": ("490-5921-2-ND", "https://www.digikey.com/en/products/detail/murata-electronics/GRM1555C1H100JA01D/3661907", 0),+ "lcsc": ("C76946", "https://www.lcsc.com/product-detail/C76946.html", 315188)},+ "notes": [],+ },+ {+ "slug": "grm155r71h103ka88d", "mpn": "GRM155R71H103KA88D", "mfr": "Murata",+ "mfr_full": "Murata Manufacturing", "source_slug": "murata",+ "kind": "C", "category": "Capacitor", "subcategory": "MLCC, Class 2 (X7R)",+ "value_sym": "10nF", "value": "10 nF (10000 pF)", "tol": "+/-10 % (K)", "voltage": "50 V DC (1H)",+ "dielectric": "X7R (EIA), Murata code R7: -15 to +15 % over -55 to 125 C",+ "rating_row": ("Dielectric", "X7R (EIA) / R7, -15 to +15 %"),+ "op_temp": "-55 to 125 C", "brief": "MLCC 10 nF +/-10 %, 50 V, X7R, 0402 (1005 metric)",+ "package": "0402 (1005 metric)", "fp": "C_0402_1005Metric", "fp_lib": "Capacitor_SMD",+ "body_mm": {"x_mm": 1.0, "y_mm": 0.5, "z_mm": 0.5},+ "product_url": "https://pim.murata.com/en-us/pim/details/?partNum=GRM155R71H103KA88%23",+ "ds": {"file": "docs/grm155r71h103ka88d-datasheet.pdf", "local": "ds-grm155r71h/GRM155R71H103KA88-01A.pdf",+ "url": "https://search.murata.co.jp/Ceramy/image/img/A01X/G101/ENG/GRM155R71H103KA88-01A.pdf",+ "title": "Murata reference sheet GRM155R71H103KA88-01A, specifications as of Jun. 18, 2026", "pages": 33},+ "extra_docs": [],+ "spec_rows": [+ ("Capacitance", "10000 pF (10 nF)", "p.2 Rated Value"),+ ("Tolerance", "+/-10 % (code K)", "p.2 Rated Value"),+ ("Rated voltage", "50 V DC (code 1H)", "p.2 Rated Value"),+ ("Temperature characteristic", "X7R (EIA), Murata code R7: -15 to +15 % over -55 to 125 C (ref. 25 C)", "p.2 Rated Value"),+ ("Operating temperature", "-55 to 125 C", "p.2 Rated Value"),+ ("Dissipation factor", "0.025 max", "p.3 item 7"),+ ("Insulation resistance", "more than 10000 MOhm at rated voltage", "p.3 item 5"),+ ("Mounting", "flow or reflow", "p.2 Rated Value"),+ ("Size", "L 1.0 +/-0.05, W 0.5 +/-0.05, T 0.5 +/-0.05, e 0.15 to 0.35, g 0.3 min (mm)", "p.2 Type & Dimension"),+ ("Packaging (suffix D)", "180 mm reel, paper tape W8P2, 10000 pcs per reel", "p.2 Package"),+ ],+ "overlay": {"L": [1.0, 0.05], "W": [0.5, 0.05], "T": [0.5, 0.05], "band_top": [0.15, 0.35], "band_bot": [0.15, 0.35],+ "band_top_name": "e (terminal band), top", "band_bot_name": "e (terminal band), bottom",+ "source": "Murata GRM155R71H103KA88-01A reference sheet p.2 'Type & Dimension' (1005M/0402)",+ "crop": ["m10n-02.png", [60, 225, 760, 540]]},+ "dims_text": "p.2 'Type & Dimension', size code 1005M(0402): L 1.0 +/-0.05, W 0.5 +/-0.05, T 0.5 +/-0.05, e 0.15 to 0.35, g 0.3 min (mm)",+ "land": MURATA_LAND, "land_doc": None,+ "marking": "The Murata reference sheet specifies no part marking: none of its 33 pages has a marking section, and the p.2 dimension sketch shows a plain body",+ "marking_src": "GRM155R71H103KA88-01A, all 33 pages searched; p.2",+ "dist": {"mouser": ("81-GRM155R71H103KA8D", "https://www.mouser.com/ProductDetail/Murata-Electronics/GRM155R71H103KA88D?qs=Dfh4SrgScWxOVlCuzd3ZyQ%3D%3D", 1054228),+ "digikey": ("490-4516-2-ND", "https://www.digikey.com/en/products/detail/murata-electronics/GRM155R71H103KA88D/1033252", 3947092),+ "lcsc": ("C77019", "https://www.lcsc.com/product-detail/C77019.html", 237370)},+ "notes": ["X7R capacitance falls with applied DC voltage and with age; check Murata's DC-bias data for the working voltage of your circuit."],+ },+ {+ "slug": "rc0402fr-074k7l", "mpn": "RC0402FR-074K7L", "mfr": "YAGEO",+ "mfr_full": "YAGEO", "source_slug": "yageo",+ "kind": "R", "category": "Resistor", "subcategory": "Thick film chip resistor",+ "value_sym": "4.7k", "value": "4.7 kOhm", "tol": "+/-1 % (F)", "voltage": "50 V max working, 100 V max overload",+ "dielectric": "", "rating_row": ("Power rating", "1/16 W (0.0625 W) at 70 C"),+ "op_temp": "-55 to 155 C", "brief": "Thick film chip resistor 4.7 kOhm +/-1 %, 1/16 W, 0402 (1005 metric)",+ "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},+ "product_url": "https://yageogroup.com/products/productDetail/RC0402FR-074K7L",+ "ds": {"file": "docs/rc0402fr-074k7l-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},+ "extra_docs": [{"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"}],+ "spec_rows": [+ ("Resistance", "4.7 kOhm (code 4K7)", "p.2 ordering information"),+ ("Tolerance", "+/-1 % (code F), E24/E96, range 1 Ohm to 10 MOhm", "p.2, p.5 Table 2"),+ ("Rated power", "1/16 W (0.0625 W) at 70 C, standard power (reel code 07)", "p.2 (5), p.5 Table 2, p.7 derating"),+ ("Max working voltage", "50 V", "p.5 Table 2"),+ ("Max overload voltage", "100 V", "p.5 Table 2"),+ ("Dielectric withstanding voltage", "100 V", "p.5 Table 2"),+ ("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"),+ ("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"),+ ("Packaging (R, 07)", "7 inch (178 mm) paper taping reel, 10000 pcs", "p.2, p.7 Table 4"),+ ],+ "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": "YAGEO states 'No Marking' for RC0402 (RC_L product specification p.3, Fig. 1)",+ "marking_src": "RC_L product specification V.14, p.3 'Marking'",+ "dist": {"mouser": ("603-RC0402FR-074K7L", "https://www.mouser.com/ProductDetail/YAGEO/RC0402FR-074K7L?qs=V1yeUXFNrkn%2FmCXC8N8TTA%3D%3D", 5501943),+ "digikey": ("311-4.7KLRTR-ND", "https://www.digikey.com/en/products/detail/yageo/RC0402FR-074K7L/2827563", 0),+ "lcsc": ("C105871", "https://www.lcsc.com/product-detail/C105871.html", 9075667)},+ "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."],+ },+ {+ "slug": "0402zd105kat2a", "mpn": "0402ZD105KAT2A", "mfr": "KYOCERA AVX",+ "mfr_full": "KYOCERA AVX Components", "source_slug": "kyocera-avx",+ "kind": "C", "category": "Capacitor", "subcategory": "MLCC, Class 2 (X5R)",+ "value_sym": "1uF", "value": "1 uF", "tol": "+/-10 % (K)", "voltage": "10 V DC (Z)",+ "dielectric": "X5R (D): within +/-15 % from -55 to +85 C",+ "rating_row": ("Dielectric", "X5R (code D), +/-15 % from -55 to +85 C"),+ "op_temp": "-55 to +85 C", "brief": "MLCC 1 uF +/-10 %, 10 V, X5R, 0402 (1005 metric)",+ "package": "0402 (1005 metric)", "fp": "C_0402_1005Metric", "fp_lib": "Capacitor_SMD",+ "body_mm": {"x_mm": 1.0, "y_mm": 0.5, "z_mm": 0.5},+ "product_url": "https://www.kyocera-avx.com/products/ceramic-capacitors/surface-mount/x5r-dielectric/",+ "ds": {"file": "docs/0402zd105kat2a-datasheet.pdf", "local": "ds-avx-legacy/cx5r.pdf",+ "url": "https://datasheets.kyocera-avx.com/cx5r.pdf",+ "title": "KYOCERA AVX X5R Dielectric General Specifications, TDS-SMDMLCC-0014 Rev 4 (catalog pages 36 to 39)", "pages": 4},+ "extra_docs": [{"file": "docs/kyocera-avx-x5r-kgm-series.pdf", "local": "ds-avx/cx5r-KGM.pdf",+ "url": "https://datasheets.kyocera-avx.com/cx5r-KGM.pdf",+ "title": "KYOCERA AVX X5R Dielectric, KGM Series, TDS-SMDMLCC-0035 Rev 9 (catalog pages 22 to 25)"}],+ "spec_rows": [+ ("Capacitance", "1 uF (code 105)", "p.1 (catalog p.36) part number"),+ ("Tolerance", "+/-10 % (code K)", "p.1 (catalog p.36)"),+ ("Rated voltage", "10 V DC (code Z)", "p.1 (catalog p.36)"),+ ("Dielectric", "X5R (code D), EIA Class II, capacitance within +/-15 % from -55 to +85 C", "p.1 (catalog p.36)"),+ ("Terminations", "plated Ni and Sn (code T)", "p.1 (catalog p.36)"),+ ("Packaging", "7 inch reel (code 2), paper", "p.1, p.3 (catalog pp.36, 38)"),+ ("Size", "L 1.00 +/-0.20, W 0.50 +/-0.20, terminal t 0.25 +/-0.10, thickness letter C: 0.56 max (mm)", "p.3 (catalog p.38)"),+ ("Soldering", "reflow or wave (0402 column)", "p.3 (catalog p.38)"),+ ],+ "overlay": {"L": [1.0, 0.2], "W": [0.5, 0.2], "T": {"nom": None, "min": 0.0, "max": 0.56},+ "band_top": [0.15, 0.35], "band_bot": [0.15, 0.35],+ "band_top_name": "t (terminal), top", "band_bot_name": "t (terminal), bottom",+ "source": "KYOCERA AVX X5R General Specifications Rev 4, catalog p.38 (0402, 10 V, 1.0 uF: letter C)",+ "crop": ["avx-3.png", [35, 150, 815, 790]]},+ "dims_text": "catalog p.38 (PDF p.3), 0402: L 1.00 +/-0.20, W 0.50 +/-0.20, t 0.25 +/-0.10 (mm); 1.0 uF at 10 V is thickness letter C, 0.56 mm max",+ "land": {"source": "KYOCERA MLCC Safety Application Guide, 'Design specifications of printed wiring board' (ele.kyocera.com), 0402 row for 1.0 +/-0.15; the 1.0 +/-0.20 row lists no values",+ "url": "https://ele.kyocera.com/en/product/capacitor/ceramic/mlcc-handling/mounting-01/",+ "kind": "range", "gap_a": [0.40, 0.60], "len_b": [0.40, 0.50], "wid_c": [0.50, 0.75],+ "letters": "a = gap between lands, b = land length, c = land width"},+ "marking": "The KYOCERA AVX X5R sheets (legacy Rev 4 and KGM Rev 9) specify no part marking: neither has a marking section and both show plain bodies",+ "marking_src": "cx5r.pdf (4 pages) and cx5r-KGM.pdf (4 pages), all pages searched",+ "dist": {"mouser": ("581-0402ZD105K", "https://www.mouser.com/ProductDetail/KYOCERA-AVX/0402ZD105KAT2A?qs=dV90weSEKCliw4I59tFTyQ%3D%3D", 1019223),+ "digikey": ("478-KGM05AR51A105KHTR-ND", "https://www.digikey.com/en/products/detail/kyocera-avx/0402ZD105KAT2A/1545026", 956998),+ "lcsc": ("C597062", "https://www.lcsc.com/product-detail/C597062.html", 1164)},+ "notes": [+ "KYOCERA AVX has moved this part to its global KGM numbering: Mouser's listing for 0402ZD105KAT2A reads 'NEW GLOBAL PN KGM05AR51A105KH', and DigiKey's part number (478-KGM05AR51A105KHTR-ND) carries the new code. The KGM sheet (docs/kyocera-avx-x5r-kgm-series.pdf) gives the same 0402 body (L 1.00 +/-0.20, W 0.50 +/-0.20, t 0.25 +/-0.10, catalog p.24) and lists KGM05AR51A105 at 10 V (thickness A, 0.56 max). The KGM sheet itself does not print the old number; the cross reference comes from the distributors.",+ "X5R capacitance falls with applied DC voltage; check the maker's DC-bias data (spicat.kyocera-avx.com) at your working voltage.",+ ],+ },+ {+ "slug": "cc0805kkx5r7bb106", "mpn": "CC0805KKX5R7BB106", "mfr": "YAGEO",+ "mfr_full": "YAGEO", "source_slug": "yageo",+ "kind": "C", "category": "Capacitor", "subcategory": "MLCC, Class 2 (X5R), general purpose and high capacitance",+ "value_sym": "10uF", "value": "10 uF", "tol": "+/-10 % (K)", "voltage": "16 V DC (7)",+ "dielectric": "X5R",+ "rating_row": ("Dielectric", "X5R"),+ "op_temp": "-55 to +85 C (X5R)", "brief": "MLCC 10 uF +/-10 %, 16 V, X5R, 0805 (2012 metric)",+ "package": "0805 (2012 metric)", "fp": "C_0805_2012Metric", "fp_lib": "Capacitor_SMD",+ "body_mm": {"x_mm": 2.0, "y_mm": 1.25, "z_mm": 1.25},+ "product_url": "https://yageogroup.com/products/productDetail/CC0805KKX5R7BB106",+ "ds": {"file": "docs/cc0805kkx5r7bb106-datasheet.pdf", "local": "ds-cc/UPY-GPHC_X5R_4V-TO-50V.pdf",+ "url": "https://yageogroup.com/content/datasheet/asset/file/UPY-GPHC_X5R_4V-TO-50V",+ "title": "YAGEO Surface Mount MLCC, General Purpose & High Cap., X5R 4 V to 50 V, product specification V.32, Sep. 16, 2026", "pages": 20},+ "extra_docs": [{"file": "docs/yageo-mlcc-general-data-v25.pdf", "local": "yageo-mlcc-gen/UPY-C_GEN_25.pdf",+ "url": "https://forum.digikey.com/t/yageo-smt-mlcc-soldering-recommendation-and-land-pattern-dimension/27457",+ "title": "YAGEO Surface-Mount Ceramic Multilayer Capacitors, General data, product specification V.25, Mar. 4, 2020 (copy YAGEO supplied through the DigiKey TechForum; not found on yageogroup.com)"}],+ "spec_rows": [+ ("Capacitance", "10 uF (code 106)", "p.2 ordering information"),+ ("Tolerance", "+/-10 % (code K)", "p.2 (2)"),+ ("Rated voltage", "16 V DC (code 7)", "p.2 (4)"),+ ("Dielectric", "X5R", "p.2"),+ ("Packing", "K = blister taping reel, 7 inch; 3000 pcs per reel for 1.25 mm thick 0805", "p.2 (3), p.8 Table 10"),+ ("Thickness class", "EB: 1.25 +/-0.20 mm (0805, 10 uF, 16 V)", "p.6 Table 6"),+ ("Size", "L1 2.0 +/-0.20, W 1.25 +/-0.20, T 1.25 +/-0.20, L2/L3 0.25 to 0.75, L4 0.7 min (mm)", "p.3 Table 1, p.6 Table 7"),+ ("Soldering", "reflow only (0805 above 2.2 uF)", "p.13 Table 12"),+ ("Terminations", "nickel barrier, plated tin (NiSn)", "p.3 Construction"),+ ("MSL", "Level 1", "p.2 Features"),+ ],+ "overlay": {"L": [2.0, 0.2], "W": [1.25, 0.2], "T": [1.25, 0.2], "band_top": [0.25, 0.75], "band_bot": [0.25, 0.75],+ "band_top_name": "L2/L3 (terminal band), top", "band_bot_name": "L2/L3 (terminal band), bottom",+ "source": "YAGEO X5R product specification V.32 p.3 Table 1 and p.6 Table 7 (0805, code EB)",+ "crop": ["cc-03.png", [60, 450, 780, 965]], "ppmm": 130},+ "dims_text": "p.3 Table 1 and p.6 Table 7, 0805 code EB: L1 2.0 +/-0.20, W 1.25 +/-0.20, T 1.25 +/-0.20, L2/L3 0.25 to 0.75, L4 0.7 min (mm); p.6 Table 6 gives EB for 10 uF at 16 V",+ "land": {"source": "YAGEO MLCC General data V.25, p.11 Table 10 (reflow), size 0805", "kind": "tol",+ "gap_a": [0.65, 1.15], "len_b": [0.70, 1.20], "wid_c": [1.15, 1.65], "overall": [2.55, 3.05],+ "nominal": {"gap_a": 0.9, "len_b": 0.95, "wid_c": 1.4, "overall": 2.8},+ "letters": "A = overall length, B = gap between lands, C = land length, D = land width (YAGEO letters), each +/-0.25"},+ "marking": "The YAGEO X5R product specification specifies no part marking: none of its 20 pages has a marking section",+ "marking_src": "UPY-GPHC X5R V.32, all 20 pages searched",+ "dist": {"mouser": ("603-CC805KKX5R7BB106", "https://www.mouser.com/ProductDetail/YAGEO/CC0805KKX5R7BB106?qs=7s%252B3O6pAiyA%252BUw6Ba1dMIA%3D%3D", 103650),+ "digikey": ("311-1865-2-ND", "https://www.digikey.com/en/products/detail/yageo/CC0805KKX5R7BB106/5195271", 0),+ "lcsc": ("C89827", "https://www.lcsc.com/product-detail/C89827.html", 7)},+ "notes": ["A 10 uF X5R part in 0805 loses a large share of its capacitance under DC bias; check YAGEO's DC-bias data at your working voltage."],+ },+]
provenance/tools/records.pyadded+350@@ -0,0 +1,350 @@+"""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>+"""+import sys, os, json, hashlib, re+sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))+from parts import PARTS, TODAY++ROOT = "/tmp/claude-1001/passives5"+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 = B["step"], B["fp"], B["sym"]+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")))+def p_(f): return os.path.join(OUT, 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"]+LAND_BY = "KYOCERA (its MLCC application guide; the KYOCERA AVX sheets give none)" if P["slug"] == "0402zd105kat2a" else P["mfr"]+kind_word = "capacitor" if P["kind"] == "C" else "resistor"++# ---------------- land pattern text ----------------+L = P["land"]+rows = land["rows"]+def land_table():+ if L["kind"] == "nominal":+ t = "| Dimension | KiCad footprint | Maker's 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"+ return t+ t = "| Dimension | KiCad footprint | Maker's range | Result |\n|---|---|---|---|\n"+ for r in rows:+ res = "inside" if r["within"] else f"outside by {r['outside_by_mm']:+.2f} mm"+ t += f"| {r['dim']} | {r['kicad_mm']:.2f} mm | {r['maker_min']:.2f} to {r['maker_max']:.2f} mm | {res} |\n"+ return t+outs = [r for r in rows if r.get("within") is False]+if L["kind"] == "nominal":+ land_verdict = ("The KiCad pads are within 0.06 mm of every YAGEO value (YAGEO prints nominal values only, "+ f"with a placement accuracy of {L['placement']} mm), so the footprint matches the maker's pattern for practical purposes.")+ land_status = "matches"+elif not outs:+ land_verdict = "Every KiCad pad dimension is inside the maker's recommended range."+ land_status = "inside"+else:+ o = ", ".join(f"{r['dim']} by {r['outside_by_mm']:+.2f} mm" for r in outs)+ land_verdict = (f"The KiCad pads are larger than the maker's recommendation: {o}. The gap between the pads is inside the range. "+ "KiCad's footprint is generated to IPC-7351 nominal density (its own description says so), not to this maker's table. "+ "A design that wants the maker's land should shrink the pads to the numbers in the table.")+ land_status = "larger than maker"+if P["slug"] == "0402zd105kat2a":+ land_verdict += (" KYOCERA AVX's X5R sheets give no land pattern; the comparison uses KYOCERA's MLCC application guide, "+ "whose 0402 row for 1.0 +/-0.20 mm parts (this body) is left blank, so the nearest printed row (1.0 +/-0.15 mm) is used.")++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 recommended by {LAND_BY}.++++Grey is the part body at its datasheet nominal size, teal is the KiCad copper, the dashed amber outline is the maker's+land (middle of its printed range, or its printed nominal), and the amber bands show where the maker allows the inner+and outer pad edges when it prints a range.++## Numbers++{land_table()}+Maker's letters: {L['letters']}.++Source: {L['source']}.{(' Link: ' + L['url']) if L.get('url') else ''}++## Result++{land_verdict}++KiCad pad centres are at +/-{abs(land['kicad']['overall'] - land['kicad']['len']) / 2:.2f} mm, pad size {land['kicad']['len']:.2f} x {land['kicad']['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 the maker'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 manufacturer STEP was reachable for this exact part number; the model is KiCad's library package, checked against the datasheet table", "result": "note"})+if P["slug"] == "0402zd105kat2a":+ ck.append({"text": "the sheet prints thickness as a maximum only (letter C, 0.56 mm); the check range is 0 to 0.56 mm", "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": f"datasheet ({ds['title']})", "href": ds["file"]}],+ "files": {STEP: sha(STEP), "package-reference.glb": sha("package-reference.glb"), ds["file"]: sha(ds["file"])}})+lck = []+for r in rows:+ if "within" in r:+ lck.append({"text": f"{r['dim']}: KiCad {r['kicad_mm']:.2f} mm, maker {r['maker_min']:.2f} to {r['maker_max']:.2f} mm", "result": "pass" if r["within"] else "note"})+ else:+ lck.append({"text": f"{r['dim']}: KiCad {r['kicad_mm']:.2f} mm, maker {r['maker_nominal']:.2f} mm (difference {r['difference_mm']:+.2f} mm)", "result": "pass"})+entries.append({"date": TODAY, "by": by, "status": "verified" if land_status != "larger than maker" else "open",+ "title": "Footprint compared with the maker's recommended land pattern" + (" (KiCad pads larger than the maker's range)" if land_status == "larger than maker" else ""),+ "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"}],+ "files": {FP: sha(FP)}})+entries.append({"date": TODAY, "by": by, "status": "verified", "title": "Marking: the model shows the real part, which is unmarked",+ "scope": ["3d-model", "marking"], "variants": ["*"],+ "checks": [{"text": f"{P['marking']} ({P['marking_src']})", "result": "pass"},+ {"text": "no AI-added part-number etch on any model", "result": "pass"}],+ "evidence": [{"label": "datasheet", "href": ds["file"]}], "files": {STEP: sha(STEP)}})+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": "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 and polarity",+ "scope": ["footprint", "3d-model", "symbol"], "variants": ["*"],+ "checks": [{"text": f"non-polar two-terminal {kind_word}: pads 1 and 2 are interchangeable; symbol pins 1 and 2 map to pads 1 and 2", "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)}})+ver = {"schema": "adom/verification@1", "part": MPN, "variants": [], "entries": entries}+json.dump(ver, open(p_("verification.json"), "w"), indent=1)++# ---------------- models.json ----------------+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, 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/package-reference-step.png"},+ {"path": "package-reference.glb", "format": "glb", "title": "Package model (GLB)", "status": "current", "slot": "model_3d", "variant": "plain", "role": "derived",+ "use": ["render"], "marking": None, "derived_from": STEP, "unique": "The same model for the page viewer (step2glb)",+ "source": KICAD_SRC, "sha256": sha("package-reference.glb"), "git_blob": blob("package-reference.glb"), "bytes": os.path.getsize(p_("package-reference.glb"))},+]+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": None, "derived_from": 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 the GLB and LOD files derived from it) are KiCad library+ content, CC-BY-SA 4.0 with the KiCad library exception+ ({GL}/kicad-footprints, {GL}/kicad-packages3D).+- The PDFs in docs/ are {P['mfr']} documents, copyright of their publishers,+ included unchanged 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']}))")]+for x in P["extra_docs"]:+ res_rows.append(("Supporting document", f"{x['title']}, [PDF]({x['file']}) ([source]({x['url']}))"))+if L.get("url"):+ res_rows.append(("Land pattern guidance", f"[{L['source'].split(',')[0]}]({L['url']})"))+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[k][0]}]({D[k][1]}) | {D[k][2]:,} |\n" for k, 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 the land pattern recommended by {LAND_BY}, at true scale. "+ f"{'It matches the maker closely.' if land_status in ('matches', 'inside') else 'The KiCad pads are a little larger than the maker asks for, and the guide shows by how much.'} "+ f"Use it to decide whether to keep the KiCad pads or shrink them to the maker's numbers before layout.")+readme = f"""# {MPN}++{P['mfr']} {MPN}: {P['brief']}.++::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']} |+| {'Rated voltage' if P['kind'] == 'C' else 'Voltage'} | {P['voltage']} |+| {P['rating_row'][0]} | {P['rating_row'][1]} |+| Operating temperature | {P['op_temp']} |+| Package | {P['package']} |+| Datasheet | [{ds['title']}]({ds['file']}) |++## Key specifications++{spec_tbl}+All page numbers refer to the PDF in [docs/]({ds['file']}) unless stated otherwise.++{('## Notes' + chr(10) + chr(10) + notes) if notes else ''}+## Ordering++{dist_tbl}+Stock figures are a snapshot from the Adom parts search on {TODAY}; check the distributor before ordering.++## Manufacturer and resources++{res_tbl}+## Pins++| Pin | Function |+|---|---|+| 1 | terminal (non-polar) |+| 2 | terminal (non-polar) |++A {kind_word} of this kind has no polarity and no pin 1 orientation: either terminal may face either way.++## Land pattern: KiCad footprint vs {P['mfr']}++<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> Land pattern </sub></td>+<td>{card_three}<br><br><a href="land-pattern/README.md">The comparison, with the numbers</a></td>+</tr>+</table>++## 3D model++No manufacturer STEP could be downloaded for this exact part number ({P['mfr']}'s CAD downloads are behind its+interactive product search), so the page uses KiCad's library model for the package, `{P['fp']}.step`, with its bytes+unchanged, renamed `{STEP}`. It was checked against the datasheet table before use (next section). The GLB for the+page viewer was made from it with `step2glb convert`. {P['marking']} ({P['marking_src']}), so the model shows a plain body.++::adom-models{{src="/{OWNER}/{slug}/render/models.json"}}++## Model checked against the datasheet++The 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.++++Source: {ds['title']}, {P['dims_text']}.++## Board levels of detail++Clean board-use GLBs (no footprint pads, outlines, labels or silkscreen; no marking) 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="/{OWNER}/{slug}/render/lod/manifest.json"}}++## CAD files++| File | What it is |+|---|---|+| `{SYM}` | KiCad symbol (standard {kind_word} graphic) with MPN, Manufacturer, Mouser, DigiKey and LCSC fields |+| `{FP}` | KiCad footprint (KiCad library `{P['fp']}`, renamed; model path `${{KIPRJMOD}}/{STEP}`) |+| `{STEP}` | 3D package model, STEP |+| `package-reference.glb` | 3D package model, GLB |+| `lod/` | board-use GLBs in four levels of detail, with previews and manifest |++## Sources and license++- {P['mfr']}: {ds['title']} ({ds['url']})+{''.join(f'- {x["title"]} ({x["url"]}){chr(10)}' for x in P['extra_docs'])}- 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 the publishers' 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 the maker's current datasheet for your design.+"""+readme = re.sub(r"\n{3,}", "\n\n", readme)+open(p_("README.md"), "w").write(readme)++# ---------------- page.json / package.json ----------------+title = f"{MPN} - {P['mfr']}"+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"],+ "pins": [{"number": "1", "name": "~"}, {"number": "2", "name": "~"}],+ "parts": {"symbol": SYM, "footprint": FP, "step": STEP, "model_3d": "package-reference.glb", "datasheet": ds["file"]},+ "manufacturer_links": {"product": P["product_url"], "datasheet_pdf": ds["url"]},+ "distributor_links": {k: {"part": D[k][0], "url": D[k][1]} for k in ("mouser", "digikey", "lcsc")},+ "marking": {"text": None, "statement": P["marking"], "source": P["marking_src"]},+ "provenance": {"model_3d": "KiCad library model, checked against the datasheet table", "footprint": "KiCad standard library",+ "land_pattern_check": f"land-pattern/README.md ({land_status})", "omitted": []},+}+tags = ["hardware", "component", "passive", P["category"].lower(), P["package"].split()[0], P["mfr"].lower().replace(" ", "-")]+triggers = [MPN, MPN.lower(), f"{P['value']} {P['package'].split()[0]} {kind_word}"]+page = {"slug": slug, "title": title, "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)+prov = {+ "manufacturer_reference": P["product_url"],+ "symbol_source": f"Original, written for this page (standard {kind_word} graphic, non-polar). 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_bytes_unchanged": True,+ "manufacturer_step": {"found": False, "searched": TODAY,+ "note": f"{P['mfr']} publishes CAD through interactive product pages; no direct STEP download for {MPN} was reachable without a browser session, 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.",+ "frame": {"units": "mm (STEP), metres (GLB)", "up_axis": "Z", "seat_z": 0, "origin": "footprint origin", "transform": "none"},+ "glb": {"tool": "step2glb convert", "exit": 0, "stderr_tail": B["glb_stderr"]},+ "hero": {"tool": "step2glb thumbnail --width 800 --height 600 (iso)", "path": "docs/hero.png"},+ "datasheet": {"file": ds["file"], "sha256": sha(ds["file"]), "url": ds["url"], "title": ds["title"], "retrieved": TODAY},+ "supporting_documents": [{"file": x["file"], "sha256": sha(x["file"]), "url": x["url"], "title": x["title"], "retrieved": TODAY} for x in P["extra_docs"]],+ "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},+ "marking": {"real_marking": None, "statement": P["marking"], "source": P["marking_src"]},+ "distributors": {"tool": "adom-parts-search search " + MPN, "date": TODAY,+ **{k: {"part": D[k][0], "url": D[k][1], "stock": D[k][2]} for k in ("mouser", "digikey", "lcsc")}},+ "lod": {"manifest": "lod/manifest.json", "generator": "provenance/tools/lod.py", "source_sha256": sha(STEP)},+ "tools_note": "lod.py, ortho.py and overlay_chip.py come from the GRM155R71C104KA88D component page; overlay_chip.py was extended to accept min/max ranges and a per-part scale. build.py, parts.py, landcheck.py and records.py built this page.",+ "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)
verification.jsonadded+230@@ -0,0 +1,230 @@+{+ "schema": "adom/verification@1",+ "part": "GRM1555C1H100JA01D",+ "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.500 mm, datasheet 0.45 to 0.55 mm",+ "result": "pass"+ },+ {+ "text": "e (terminal band), top: model 0.200 mm, datasheet 0.15 to 0.35 mm",+ "result": "pass"+ },+ {+ "text": "e (terminal band), bottom: model 0.200 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 manufacturer STEP was reachable for this exact part number; the model is KiCad's library package, checked against the datasheet table",+ "result": "note"+ }+ ],+ "evidence": [+ {+ "label": "overlay (top, bottom, side, end at true scale)",+ "href": "docs/verify/grm1555c1h100ja01d-overlay.png"+ },+ {+ "label": "numbers",+ "href": "docs/verify/grm1555c1h100ja01d-check.json"+ },+ {+ "label": "datasheet (Murata reference sheet GRM1555C1H100JA01-01A, specifications as of Jun. 13, 2026)",+ "href": "docs/grm1555c1h100ja01d-datasheet.pdf"+ }+ ],+ "files": {+ "GRM1555C1H100JA01D.step": "03e44c4b2b727b8d4b6b1fd598cbd12dd5e614f1dfeefa96a92a07e3a3b312a2",+ "package-reference.glb": "100935c5c0d6f20a6c9bdfb6386f874dc8a4457bf0e4f3ace69f1ab090100773",+ "docs/grm1555c1h100ja01d-datasheet.pdf": "5f487d20c0b95ac37d981491d969c8061e7a6cd3976070d3165ce3aeb72964e1"+ }+ },+ {+ "date": "2026-10-21",+ "by": {+ "name": "Claude (AI agent) for John Lauer",+ "handle": "john"+ },+ "status": "open",+ "title": "Footprint compared with the maker's recommended land pattern (KiCad pads larger than the maker's range)",+ "scope": [+ "footprint"+ ],+ "variants": [+ "*"+ ],+ "checks": [+ {+ "text": "gap between lands: KiCad 0.40 mm, maker 0.30 to 0.50 mm",+ "result": "pass"+ },+ {+ "text": "land length: KiCad 0.56 mm, maker 0.35 to 0.45 mm",+ "result": "note"+ },+ {+ "text": "land width: KiCad 0.62 mm, maker 0.40 to 0.60 mm",+ "result": "note"+ },+ {+ "text": "overall length (a + 2b, derived): KiCad 1.52 mm, maker 1.00 to 1.40 mm",+ "result": "note"+ }+ ],+ "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"+ }+ ],+ "files": {+ "C_0402_1005Metric_GRM1555C1H100JA01D.kicad_mod": "7d3a5d733b20030edb791087a797ee537e933caab513f11fac19b6d8ca7c1e9a"+ }+ },+ {+ "date": "2026-10-21",+ "by": {+ "name": "Claude (AI agent) for John Lauer",+ "handle": "john"+ },+ "status": "verified",+ "title": "Marking: the model shows the real part, which is unmarked",+ "scope": [+ "3d-model",+ "marking"+ ],+ "variants": [+ "*"+ ],+ "checks": [+ {+ "text": "The Murata reference sheet specifies no part marking: none of its 33 pages has a marking section, and the p.2 dimension sketch shows a plain body (GRM1555C1H100JA01-01A, all 33 pages searched; p.2)",+ "result": "pass"+ },+ {+ "text": "no AI-added part-number etch on any model",+ "result": "pass"+ }+ ],+ "evidence": [+ {+ "label": "datasheet",+ "href": "docs/grm1555c1h100ja01d-datasheet.pdf"+ }+ ],+ "files": {+ "GRM1555C1H100JA01D.step": "03e44c4b2b727b8d4b6b1fd598cbd12dd5e614f1dfeefa96a92a07e3a3b312a2"+ }+ },+ {+ "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": "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": "52968497c1f68b0fb42890708303cc9b630c3c8789948a1738ae8684bf1c0a84",+ "lod/medium.glb": "ce29062d9fe0d9a8f3e8d109e4da0c84c50551c7cebc3c793a4747752550fa6c",+ "lod/low.glb": "bb49e87098dfd14d5aa07dd81462f772a4161881baef1fd917780ba837d5109b",+ "lod/super-low.glb": "88db0ae37933c95255ea7b5a3de8ae00f2622caf453f2854b8df8dfd476cb372"+ }+ },+ {+ "date": "2026-10-21",+ "by": {+ "name": "Claude (AI agent) for John Lauer",+ "handle": "john"+ },+ "status": "verified",+ "title": "Pin 1 and polarity",+ "scope": [+ "footprint",+ "3d-model",+ "symbol"+ ],+ "variants": [+ "*"+ ],+ "checks": [+ {+ "text": "non-polar two-terminal capacitor: pads 1 and 2 are interchangeable; symbol pins 1 and 2 map to pads 1 and 2",+ "result": "pass"+ },+ {+ "text": "model terminals sit on the footprint pads (both centred on the origin, long axis on X)",+ "result": "pass"+ }+ ],+ "evidence": [],+ "files": {+ "C_0402_1005Metric_GRM1555C1H100JA01D.kicad_mod": "7d3a5d733b20030edb791087a797ee537e933caab513f11fac19b6d8ca7c1e9a",+ "GRM1555C1H100JA01D.kicad_sym": "42887f3e919526d49186df88bed0ac019b83b011c4171c1880825cb950675b26",+ "GRM1555C1H100JA01D.step": "03e44c4b2b727b8d4b6b1fd598cbd12dd5e614f1dfeefa96a92a07e3a3b312a2"+ }+ }+ ]+}