fritzkit 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +12 -0
- package/.claude-plugin/plugin.json +13 -0
- package/CHANGELOG.md +8 -0
- package/LICENSE +21 -0
- package/README.md +429 -2
- package/dist/cli/commands/doctor.d.ts +4 -0
- package/dist/cli/commands/doctor.js +7 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/export.d.ts +17 -0
- package/dist/cli/commands/export.js +81 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/kicad.d.ts +10 -0
- package/dist/cli/commands/kicad.js +22 -0
- package/dist/cli/commands/kicad.js.map +1 -0
- package/dist/cli/commands/parts.d.ts +22 -0
- package/dist/cli/commands/parts.js +46 -0
- package/dist/cli/commands/parts.js.map +1 -0
- package/dist/cli/commands/prune.d.ts +14 -0
- package/dist/cli/commands/prune.js +67 -0
- package/dist/cli/commands/prune.js.map +1 -0
- package/dist/cli/commands/render.d.ts +24 -0
- package/dist/cli/commands/render.js +62 -0
- package/dist/cli/commands/render.js.map +1 -0
- package/dist/cli/commands/schema.d.ts +10 -0
- package/dist/cli/commands/schema.js +35 -0
- package/dist/cli/commands/schema.js.map +1 -0
- package/dist/cli/commands/ui.d.ts +14 -0
- package/dist/cli/commands/ui.js +67 -0
- package/dist/cli/commands/ui.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +24 -0
- package/dist/cli/commands/validate.js +91 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/context.d.ts +81 -0
- package/dist/cli/context.js +139 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.js +8 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/program.d.ts +21 -0
- package/dist/cli/program.js +158 -0
- package/dist/cli/program.js.map +1 -0
- package/dist/cli/raster.d.ts +4 -0
- package/dist/cli/raster.js +9 -0
- package/dist/cli/raster.js.map +1 -0
- package/dist/core/compile/breadboard-util.d.ts +12 -0
- package/dist/core/compile/breadboard-util.js +107 -0
- package/dist/core/compile/breadboard-util.js.map +1 -0
- package/dist/core/compile/breadboard.d.ts +60 -0
- package/dist/core/compile/breadboard.js +513 -0
- package/dist/core/compile/breadboard.js.map +1 -0
- package/dist/core/compile/fzp.d.ts +12 -0
- package/dist/core/compile/fzp.js +183 -0
- package/dist/core/compile/fzp.js.map +1 -0
- package/dist/core/compile/icon.d.ts +17 -0
- package/dist/core/compile/icon.js +27 -0
- package/dist/core/compile/icon.js.map +1 -0
- package/dist/core/compile/index.d.ts +4 -0
- package/dist/core/compile/index.js +62 -0
- package/dist/core/compile/index.js.map +1 -0
- package/dist/core/compile/pcb.d.ts +39 -0
- package/dist/core/compile/pcb.js +164 -0
- package/dist/core/compile/pcb.js.map +1 -0
- package/dist/core/compile/schematic.d.ts +69 -0
- package/dist/core/compile/schematic.js +240 -0
- package/dist/core/compile/schematic.js.map +1 -0
- package/dist/core/compile/style.d.ts +52 -0
- package/dist/core/compile/style.js +72 -0
- package/dist/core/compile/style.js.map +1 -0
- package/dist/core/compile/types.d.ts +50 -0
- package/dist/core/compile/types.js +15 -0
- package/dist/core/compile/types.js.map +1 -0
- package/dist/core/export/bin.d.ts +61 -0
- package/dist/core/export/bin.js +221 -0
- package/dist/core/export/bin.js.map +1 -0
- package/dist/core/export/fzpz.d.ts +37 -0
- package/dist/core/export/fzpz.js +121 -0
- package/dist/core/export/fzpz.js.map +1 -0
- package/dist/core/export/index.d.ts +5 -0
- package/dist/core/export/index.js +6 -0
- package/dist/core/export/index.js.map +1 -0
- package/dist/core/export/install.d.ts +77 -0
- package/dist/core/export/install.js +183 -0
- package/dist/core/export/install.js.map +1 -0
- package/dist/core/export/prune.d.ts +72 -0
- package/dist/core/export/prune.js +165 -0
- package/dist/core/export/prune.js.map +1 -0
- package/dist/core/fritzing.d.ts +22 -0
- package/dist/core/fritzing.js +77 -0
- package/dist/core/fritzing.js.map +1 -0
- package/dist/core/identity.d.ts +29 -0
- package/dist/core/identity.js +70 -0
- package/dist/core/identity.js.map +1 -0
- package/dist/core/image/bbox.d.ts +27 -0
- package/dist/core/image/bbox.js +24 -0
- package/dist/core/image/bbox.js.map +1 -0
- package/dist/core/image/index.d.ts +8 -0
- package/dist/core/image/index.js +9 -0
- package/dist/core/image/index.js.map +1 -0
- package/dist/core/image/key.d.ts +72 -0
- package/dist/core/image/key.js +317 -0
- package/dist/core/image/key.js.map +1 -0
- package/dist/core/image/prepare.d.ts +31 -0
- package/dist/core/image/prepare.js +98 -0
- package/dist/core/image/prepare.js.map +1 -0
- package/dist/core/image/remover.d.ts +17 -0
- package/dist/core/image/remover.js +51 -0
- package/dist/core/image/remover.js.map +1 -0
- package/dist/core/index.d.ts +16 -0
- package/dist/core/index.js +17 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/kicad/footprint.d.ts +104 -0
- package/dist/core/kicad/footprint.js +317 -0
- package/dist/core/kicad/footprint.js.map +1 -0
- package/dist/core/kicad/index.d.ts +25 -0
- package/dist/core/kicad/index.js +197 -0
- package/dist/core/kicad/index.js.map +1 -0
- package/dist/core/kicad/sexpr.d.ts +35 -0
- package/dist/core/kicad/sexpr.js +163 -0
- package/dist/core/kicad/sexpr.js.map +1 -0
- package/dist/core/resolve.d.ts +113 -0
- package/dist/core/resolve.js +301 -0
- package/dist/core/resolve.js.map +1 -0
- package/dist/core/schema/part.d.ts +995 -0
- package/dist/core/schema/part.js +278 -0
- package/dist/core/schema/part.js.map +1 -0
- package/dist/core/schema/part.schema.json +1122 -0
- package/dist/core/svg.d.ts +20 -0
- package/dist/core/svg.js +56 -0
- package/dist/core/svg.js.map +1 -0
- package/dist/core/units.d.ts +28 -0
- package/dist/core/units.js +42 -0
- package/dist/core/units.js.map +1 -0
- package/dist/core/validate/checker.d.ts +46 -0
- package/dist/core/validate/checker.js +142 -0
- package/dist/core/validate/checker.js.map +1 -0
- package/dist/core/validate/doctor.d.ts +25 -0
- package/dist/core/validate/doctor.js +156 -0
- package/dist/core/validate/doctor.js.map +1 -0
- package/dist/core/validate/explain.d.ts +10 -0
- package/dist/core/validate/explain.js +135 -0
- package/dist/core/validate/explain.js.map +1 -0
- package/dist/core/validate/index.d.ts +21 -0
- package/dist/core/validate/index.js +96 -0
- package/dist/core/validate/index.js.map +1 -0
- package/dist/core/validate/structural.d.ts +74 -0
- package/dist/core/validate/structural.js +664 -0
- package/dist/core/validate/structural.js.map +1 -0
- package/dist/core/workspace.d.ts +69 -0
- package/dist/core/workspace.js +213 -0
- package/dist/core/workspace.js.map +1 -0
- package/dist/mcp/jsonpatch.d.ts +30 -0
- package/dist/mcp/jsonpatch.js +145 -0
- package/dist/mcp/jsonpatch.js.map +1 -0
- package/dist/mcp/main.d.ts +2 -0
- package/dist/mcp/main.js +5 -0
- package/dist/mcp/main.js.map +1 -0
- package/dist/mcp/server.d.ts +28 -0
- package/dist/mcp/server.js +310 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/server/api.d.ts +72 -0
- package/dist/server/api.js +507 -0
- package/dist/server/api.js.map +1 -0
- package/dist/server/events.d.ts +28 -0
- package/dist/server/events.js +134 -0
- package/dist/server/events.js.map +1 -0
- package/dist/server/http.d.ts +36 -0
- package/dist/server/http.js +127 -0
- package/dist/server/http.js.map +1 -0
- package/dist/server/index.d.ts +65 -0
- package/dist/server/index.js +193 -0
- package/dist/server/index.js.map +1 -0
- package/dist/ui/assets/index-DLU8opyI.js +63 -0
- package/dist/ui/assets/index-GhUA-T3b.css +1 -0
- package/dist/ui/index.html +14 -0
- package/package.json +89 -4
- package/skills/fritzkit/SKILL.md +690 -0
- package/skills/fritzkit/reference/examples.md +275 -0
- package/skills/fritzkit/reference/part-json.md +333 -0
- package/skills/fritzkit/scripts/measure.py +197 -0
- package/tools/fzp-checker/.python-version +1 -0
- package/tools/fzp-checker/README.md +45 -0
- package/tools/fzp-checker/check_fzp.py +48 -0
- package/tools/fzp-checker/pyproject.toml +26 -0
- package/tools/fzp-checker/uv.lock +266 -0
- package/tools/fzp-checker/vendor/LICENSE.txt +8 -0
- package/tools/fzp-checker/vendor/UPSTREAM.md +25 -0
- package/tools/fzp-checker/vendor/fzp_checker.py +14 -0
- package/tools/fzp-checker/vendor/scripts/checks/__init__.py +26 -0
- package/tools/fzp-checker/vendor/scripts/checks/check_missing_leg_ids.py +44 -0
- package/tools/fzp-checker/vendor/scripts/checks/checkascii.py +27 -0
- package/tools/fzp-checker/vendor/scripts/checks/checkcase.py +156 -0
- package/tools/fzp-checker/vendor/scripts/checks/checkcopies.py +104 -0
- package/tools/fzp-checker/vendor/scripts/checks/connector_numbering.py +79 -0
- package/tools/fzp-checker/vendor/scripts/checks/connectors_misnumbered.py +228 -0
- package/tools/fzp-checker/vendor/scripts/checks/explain_errors.md +95 -0
- package/tools/fzp-checker/vendor/scripts/checks/fzp_checker_runner.py +717 -0
- package/tools/fzp-checker/vendor/scripts/checks/fzp_checkers.py +1069 -0
- package/tools/fzp-checker/vendor/scripts/checks/fzp_svg_checkers.py +62 -0
- package/tools/fzp-checker/vendor/scripts/checks/fzp_utils.py +222 -0
- package/tools/fzp-checker/vendor/scripts/checks/inspector_fc51.png +0 -0
- package/tools/fzp-checker/vendor/scripts/checks/invisibleconnectors.py +118 -0
- package/tools/fzp-checker/vendor/scripts/checks/nolayeridcheck.txt +758 -0
- package/tools/fzp-checker/vendor/scripts/checks/requirements.txt +3 -0
- package/tools/fzp-checker/vendor/scripts/checks/svg_checkers.py +953 -0
- package/tools/fzp-checker/vendor/scripts/checks/svg_utils.py +96 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_checkers.py +839 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/author_missing.fzp.test +3 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/author_present.fzp.test +4 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/buses_missing_id.fzp.test +8 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/buses_missing_node_members.fzp.test +7 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/buses_present_valid.fzp.test +8 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/connector_layers_missing_attributes.fzp.test +16 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/connector_layers_present_valid.fzp.test +14 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/connector_numbering_invalid.fzp.test +70 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/connector_numbering_valid.fzp.test +70 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/connector_refs_valid.fzp.test +53 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/copper_color_invalid_mixed.fzp.test +11 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/copper_color_invalid_silkscreen_nested.fzp.test +11 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/copper_color_invalid_style_attr.fzp.test +11 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/copper_color_invalid_white_stroke.fzp.test +11 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/copper_color_invalid_wrong_color.fzp.test +11 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/copper_color_valid_inherited.fzp.test +11 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/copper_color_valid_legacy.fzp.test +12 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/copper_color_valid_nested_copper.fzp.test +12 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/copper_color_valid_none.fzp.test +11 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/copper_color_valid_standard.fzp.test +12 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/copper_color_valid_uppercase.fzp.test +11 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/css_connector.fzp.test +100 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/description_missing.fzp.test +3 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/description_present.fzp.test +4 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/duplicate_ids.fzp.test +27 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/family_property_missing.fzp.test +6 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/family_property_present_valid.fzp.test +6 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/font_size.fzp.test +46 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/fritzing_version_invalid_format.fzp.test +4 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/fritzing_version_missing.fzp.test +4 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/fritzing_version_present_valid.fzp.test +4 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/gorn_absent.fzp.test +15 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/gorn_present.fzp.test +15 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/hybrid_connectors.fzp.test +232 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/invalid_xml.fzp.test +12 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/layer_ids_match.fzp.test +29 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/layer_ids_mismatch.fzp.test +30 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/layer_nesting_invalid.fzp.test +11 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/layer_nesting_valid.fzp.test +11 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/matrix_transform.fzp.test +8 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/missing_connector_refs.fzp.test +63 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/missing_leg_ids.fzp.test +34 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/module_id_missing.fzp.test +4 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/module_id_non_alnum.fzp.test +4 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/module_id_present.fzp.test +4 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/module_id_special_chars_absent.fzp.test +4 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/module_id_special_chars_present.fzp.test +4 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/module_id_too_short.fzp.test +4 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/no_layer_invalid.fzp.test +19 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/no_layer_namedview.fzp.test +19 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/no_layer_valid.fzp.test +19 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/pcb_only.fzp.test +48 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/property_fields_missing_name.fzp.test +6 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/property_fields_missing_value.fzp.test +6 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/property_fields_present.fzp.test +6 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/required_tags_missing.fzp.test +3 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/required_tags_present.fzp.test +11 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/stroke_test.fzp.test +60 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/template_svgs.fzp.test +35 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/title_missing.fzp.test +3 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/title_present.fzp.test +4 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/unique_ids.fzp.test +27 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/unique_property_names_duplicates.fzp.test +7 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/unique_property_names_unique.fzp.test +7 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/valid_xml.fzp.test +249 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/version_invalid_format.fzp.test +4 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/version_missing.fzp.test +3 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/version_present_valid.fzp.test +4 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/views_missing.fzp.test +3 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/core/views_present.fzp.test +8 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/breadboard/connector_refs_valid_breadboard.svg +7 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/breadboard/duplicate_ids_breadboard.svg +13 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/breadboard/gorn_absent_breadboard.svg +7 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/breadboard/gorn_present_breadboard.svg +7 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/breadboard/hybrid_connectors_breadboard.svg +102 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/breadboard/layer_nesting_invalid.svg +13 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/breadboard/layer_nesting_valid.svg +13 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/breadboard/matrix_transform.svg +11 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/breadboard/missing_connector_refs_breadboard.svg +8 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/breadboard/missing_leg_ids_breadboard.svg +9 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/breadboard/test_layer_ids_match_breadboard.svg +9 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/breadboard/test_layer_ids_mismatch_breadboard.svg +9 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/breadboard/unique_ids_breadboard.svg +13 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/icon/hybrid_connectors_icon.svg +78 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/icon/no_layer_invalid.svg +4 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/icon/no_layer_namedview.svg +9 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/icon/no_layer_valid.svg +7 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/icon/plain_pcb.svg +10 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/connector_refs_valid_pcb.svg +10 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/copper_color_invalid_mixed.svg +8 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/copper_color_invalid_silkscreen_nested.svg +10 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/copper_color_invalid_style_attr.svg +6 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/copper_color_invalid_white_stroke.svg +6 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/copper_color_invalid_wrong_color.svg +6 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/copper_color_valid_inherited.svg +7 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/copper_color_valid_legacy.svg +10 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/copper_color_valid_nested_copper.svg +9 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/copper_color_valid_none.svg +7 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/copper_color_valid_standard.svg +10 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/copper_color_valid_uppercase.svg +7 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/css_connector.svg +25 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/font_size.svg +54 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/hybrid_connectors_pcb.svg +35 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/missing_connector_refs_pcb.svg +14 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/pcb-arduino-shield.svg +25 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/stroke_test.svg +12 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/test_layer_ids_match_pcb.svg +12 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/pcb/test_layer_ids_mismatch_pcb.svg +12 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/schematic/connector_refs_valid_schematic.svg +7 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/schematic/hybrid_connectors_schematic.svg +59 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/schematic/missing_connector_refs_schematic.svg +8 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/schematic/test_layer_ids_match_schematic.svg +6 -0
- package/tools/fzp-checker/vendor/scripts/checks/test_data/svg/core/schematic/test_layer_ids_mismatch_schematic.svg +6 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import getopt
|
|
2
|
+
import sys
|
|
3
|
+
import os
|
|
4
|
+
|
|
5
|
+
def usage():
|
|
6
|
+
print("""
|
|
7
|
+
usage:
|
|
8
|
+
checkcopies.py -d <directory>
|
|
9
|
+
|
|
10
|
+
<directory> is a folder containing svg files.
|
|
11
|
+
looks for files that have the same content but different names
|
|
12
|
+
|
|
13
|
+
Part of CI tests
|
|
14
|
+
""")
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def run_fast_scandir(scan_dir, ext): # scan_dir: str, ext: list
|
|
18
|
+
subfolders, files = [], []
|
|
19
|
+
|
|
20
|
+
for f in os.scandir(scan_dir):
|
|
21
|
+
if f.is_dir():
|
|
22
|
+
subfolders.append(f.path)
|
|
23
|
+
if f.is_file():
|
|
24
|
+
if os.path.splitext(f.name)[1].lower() in ext:
|
|
25
|
+
files.append(f.path)
|
|
26
|
+
|
|
27
|
+
for d in list(subfolders):
|
|
28
|
+
sf, f = run_fast_scandir(d, ext)
|
|
29
|
+
subfolders.extend(sf)
|
|
30
|
+
files.extend(f)
|
|
31
|
+
return subfolders, files
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def main():
|
|
35
|
+
try:
|
|
36
|
+
opts, args = getopt.getopt(sys.argv[1:], "hd:", ["help", "directory"])
|
|
37
|
+
except getopt.GetoptError as err:
|
|
38
|
+
# print help information and exit:
|
|
39
|
+
print(str(err)) # will print something like "option -a not recognized"
|
|
40
|
+
usage()
|
|
41
|
+
return
|
|
42
|
+
|
|
43
|
+
outputDir = None
|
|
44
|
+
gotnot = 0
|
|
45
|
+
|
|
46
|
+
for o, a in opts:
|
|
47
|
+
# print o
|
|
48
|
+
# print a
|
|
49
|
+
if o in ("-d", "--directory"):
|
|
50
|
+
outputDir = a
|
|
51
|
+
elif o in ("-h", "--help"):
|
|
52
|
+
usage()
|
|
53
|
+
return
|
|
54
|
+
else:
|
|
55
|
+
assert False, "unhandled option"
|
|
56
|
+
|
|
57
|
+
if not outputDir:
|
|
58
|
+
print("missing -d {directory} parameter")
|
|
59
|
+
usage()
|
|
60
|
+
return
|
|
61
|
+
|
|
62
|
+
subfolders, files = run_fast_scandir(outputDir, [".svg"])
|
|
63
|
+
print("Checking %d files for duplicates" % len(files))
|
|
64
|
+
files.sort(key=lambda f: os.stat(f).st_size, reverse=True)
|
|
65
|
+
matches = []
|
|
66
|
+
for i in range(0, len(files)-1):
|
|
67
|
+
f1 = files[i]
|
|
68
|
+
s = os.stat(f1).st_size
|
|
69
|
+
# print("Check candidate %s , %d" % (files[i], s))
|
|
70
|
+
j = i + 1
|
|
71
|
+
while s == os.stat(files[j]).st_size:
|
|
72
|
+
f2 = files[j]
|
|
73
|
+
# print(" other %s , %d" % (files[j], s))
|
|
74
|
+
j += 1
|
|
75
|
+
txt1 = None
|
|
76
|
+
try:
|
|
77
|
+
infile = open(f1, "r")
|
|
78
|
+
txt1 = infile.read()
|
|
79
|
+
infile.close()
|
|
80
|
+
except IOError:
|
|
81
|
+
print("failure", f1)
|
|
82
|
+
if txt1 is None:
|
|
83
|
+
continue
|
|
84
|
+
|
|
85
|
+
txt2 = None
|
|
86
|
+
try:
|
|
87
|
+
infile = open(f2, "r")
|
|
88
|
+
txt2 = infile.read()
|
|
89
|
+
infile.close()
|
|
90
|
+
except IOError:
|
|
91
|
+
print("failure", f2)
|
|
92
|
+
continue
|
|
93
|
+
if txt2 is None:
|
|
94
|
+
continue
|
|
95
|
+
|
|
96
|
+
if txt1 == txt2:
|
|
97
|
+
matches.append(
|
|
98
|
+
"<map package='{0}' to='{1}' />".format(f1, f2))
|
|
99
|
+
|
|
100
|
+
print("%d duplicate pairs found" % len(matches))
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
if __name__ == "__main__":
|
|
104
|
+
main()
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
from .fzp_checkers import FZPChecker
|
|
2
|
+
import re
|
|
3
|
+
|
|
4
|
+
class FZPConnectorNumberingChecker(FZPChecker):
|
|
5
|
+
def check(self):
|
|
6
|
+
pattern = r'(\d+)'
|
|
7
|
+
numberFinder = re.compile(pattern, re.IGNORECASE)
|
|
8
|
+
|
|
9
|
+
connectors = self.fzp_doc.xpath("//connector")
|
|
10
|
+
|
|
11
|
+
# Check if any connector has an integer name
|
|
12
|
+
gotInt = False
|
|
13
|
+
for connector in connectors:
|
|
14
|
+
try:
|
|
15
|
+
int(connector.get("name"))
|
|
16
|
+
gotInt = True
|
|
17
|
+
break
|
|
18
|
+
except (ValueError, TypeError):
|
|
19
|
+
continue
|
|
20
|
+
|
|
21
|
+
if not gotInt:
|
|
22
|
+
return self.get_result()
|
|
23
|
+
|
|
24
|
+
# Check if id or name starts from zero
|
|
25
|
+
idZero = False
|
|
26
|
+
for connector in connectors:
|
|
27
|
+
try:
|
|
28
|
+
connector_id = connector.get("id")
|
|
29
|
+
match = numberFinder.search(connector_id)
|
|
30
|
+
if match and match.group(1) == '0':
|
|
31
|
+
idZero = True
|
|
32
|
+
break
|
|
33
|
+
except:
|
|
34
|
+
continue
|
|
35
|
+
|
|
36
|
+
nameZero = False
|
|
37
|
+
for connector in connectors:
|
|
38
|
+
if connector.get("name") == "0":
|
|
39
|
+
nameZero = True
|
|
40
|
+
break
|
|
41
|
+
|
|
42
|
+
# Check for mismatches
|
|
43
|
+
for connector in connectors:
|
|
44
|
+
idInt = 0
|
|
45
|
+
nameInt = 0
|
|
46
|
+
try:
|
|
47
|
+
connector_id = connector.get("id")
|
|
48
|
+
match = numberFinder.search(connector_id)
|
|
49
|
+
if match is None:
|
|
50
|
+
continue
|
|
51
|
+
|
|
52
|
+
idInt = int(match.group(1))
|
|
53
|
+
nameInt = int(connector.get("name"))
|
|
54
|
+
|
|
55
|
+
except (ValueError, TypeError):
|
|
56
|
+
continue
|
|
57
|
+
|
|
58
|
+
mismatch = False
|
|
59
|
+
if nameZero and idZero:
|
|
60
|
+
mismatch = (idInt != nameInt)
|
|
61
|
+
elif nameZero:
|
|
62
|
+
mismatch = (idInt != nameInt + 1)
|
|
63
|
+
elif idZero:
|
|
64
|
+
mismatch = (idInt + 1 != nameInt)
|
|
65
|
+
else:
|
|
66
|
+
mismatch = (idInt != nameInt)
|
|
67
|
+
|
|
68
|
+
if mismatch:
|
|
69
|
+
self.add_warning(f"Connector mismatch: id={connector_id}, name={connector.get('name')}")
|
|
70
|
+
|
|
71
|
+
return self.get_result()
|
|
72
|
+
|
|
73
|
+
@staticmethod
|
|
74
|
+
def get_name():
|
|
75
|
+
return "connector_numbering"
|
|
76
|
+
|
|
77
|
+
@staticmethod
|
|
78
|
+
def get_description():
|
|
79
|
+
return "Check that connectors with integer names are correctly mapped to connector numbers"
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import getopt
|
|
2
|
+
import sys
|
|
3
|
+
import os
|
|
4
|
+
import os.path
|
|
5
|
+
import re
|
|
6
|
+
import xml.dom.minidom
|
|
7
|
+
import xml.dom
|
|
8
|
+
|
|
9
|
+
# Part of CI tests
|
|
10
|
+
|
|
11
|
+
def usage():
|
|
12
|
+
print("""
|
|
13
|
+
usage:
|
|
14
|
+
connectors_misnumbered.py -d [fzp folder]
|
|
15
|
+
checks that connectors with integer names are correctly mapped to connector numbers
|
|
16
|
+
""")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def skip(filename):
|
|
20
|
+
skip_files = [
|
|
21
|
+
"./core/AlphaNumericDisplay-v13.fzp",
|
|
22
|
+
"./core/Arduino_Esplora.fzp",
|
|
23
|
+
"./core/arduinoXbeere.fzp",
|
|
24
|
+
"./core/ArduPilotMega_v15.fzp",
|
|
25
|
+
"./core/Bean_revE.fzp",
|
|
26
|
+
"./core/CAR_RELE_NVF4-2.fzp",
|
|
27
|
+
"./core/din-5_midi_connector.fzp",
|
|
28
|
+
"./core/electromechanical-battery-2-aaa.fzp",
|
|
29
|
+
"./core/electromechanical-battery-2-aa.fzp",
|
|
30
|
+
"./core/ESP8266-Thing-Dev.fzp",
|
|
31
|
+
"./core/grove_beginner_kit.fzp",
|
|
32
|
+
"./core/HiFive1.fzp",
|
|
33
|
+
"./core/jlpcb-089.fzp",
|
|
34
|
+
"./obsolete/kameleon.fzp",
|
|
35
|
+
"./core/LilyPad-XBee-v15.fzp",
|
|
36
|
+
"./core/ludusProtoShieldWireless.fzp",
|
|
37
|
+
"./core/monacor_ltr_110_linetransformer.fzp",
|
|
38
|
+
"./core/MyoWare_Proto_Shield.fzp",
|
|
39
|
+
"./core/pinoccio-proto.fzp",
|
|
40
|
+
"./core/Power Screwshield 1.0a.fzp",
|
|
41
|
+
"./core/ProtoShield-Mini-v12.fzp",
|
|
42
|
+
"./core/RN41-v14.fzp",
|
|
43
|
+
"./core/Rotoshield-1.0a.fzp",
|
|
44
|
+
"./core/SMD_BC847.fzp",
|
|
45
|
+
"./core/SMD_BC857.fzp",
|
|
46
|
+
"./core/Sony_Spresense_ext_board_1.fzp",
|
|
47
|
+
"./core/SonySpresenseExtension_CXD5602PWBEXT1.fzp",
|
|
48
|
+
"./core/sparkfun-connectors-db25-hp.fzp",
|
|
49
|
+
"./core/sparkfun-connectors-db25-vp.fzp",
|
|
50
|
+
"./core/sparkfun-connectors-db9-female.fzp",
|
|
51
|
+
"./core/sparkfun-connectors-db9-male.fzp",
|
|
52
|
+
"./core/sparkfun-connectors-din7-.fzp",
|
|
53
|
+
"./core/sparkfun-connectors-f25-hp.fzp",
|
|
54
|
+
"./core/sparkfun-connectors-f25-vp.fzp",
|
|
55
|
+
"./core/sparkfun-connectors-ftdi_basic-pth.fzp",
|
|
56
|
+
"./core/sparkfun-connectors-m02-4ucon-15767.fzp",
|
|
57
|
+
"./core/sparkfun-connectors-m02--jst-2mm-smt.fzp",
|
|
58
|
+
"./core/sparkfun-connectors-m02-rocker.fzp",
|
|
59
|
+
"./core/sparkfun-connectors-m03-.fzp",
|
|
60
|
+
"./core/sparkfun-connectors-m03-smd.fzp",
|
|
61
|
+
"./core/sparkfun-connectors-m04-smd2.fzp",
|
|
62
|
+
"./core/sparkfun-connectors-m05-smd2.fzp",
|
|
63
|
+
"./core/sparkfun-connectors-m05-smd.fzp",
|
|
64
|
+
"./core/sparkfun-connectors-m06-em406.fzp",
|
|
65
|
+
"./core/sparkfun-connectors-m06-smdf.fzp",
|
|
66
|
+
"./core/sparkfun-connectors-m06-smd-straight-combo.fzp",
|
|
67
|
+
"./core/sparkfun-connectors-m08-smd-combo.fzp",
|
|
68
|
+
"./core/sparkfun-displays-7-segment-4digit-for_pogobed_only.fzp",
|
|
69
|
+
"./core/sparkfun-displays-7-segment-4digit-pth.fzp",
|
|
70
|
+
"./core/sparkfun-electromechanical-ayz0202-.fzp",
|
|
71
|
+
"./core/sparkfun-electromechanical-relay-2-g5q.fzp",
|
|
72
|
+
"./core/sparkfun-electromechanical-switch-dpdt-eg2211.fzp",
|
|
73
|
+
"./core/sparkfun-electromechanical-switch-dpdt-es.fzp",
|
|
74
|
+
"./core/sparkfun-electromechanical-switch-dpdt-gpi.fzp",
|
|
75
|
+
"./core/sparkfun-electromechanical-switch-dpdt-pth.fzp",
|
|
76
|
+
"./core/sparkfun-electromechanical-switch-momentary-2-12mm.fzp",
|
|
77
|
+
"./core/sparkfun-electromechanical-switch-momentary-2-.fzp",
|
|
78
|
+
"./core/sparkfun-electromechanical-switch-momentary-2-pth.fzp",
|
|
79
|
+
"./core/sparkfun-electromechanical-switch-momentary-2-smd-2.fzp",
|
|
80
|
+
"./core/sparkfun-electromechanical-switch-momentary-2-smd.fzp",
|
|
81
|
+
"./core/sparkfun-electromechanical-switch-sp3t-.fzp",
|
|
82
|
+
"./core/sparkfun-freqctrl-crystal-5x3.fzp",
|
|
83
|
+
"./core/sparkfun-freqctrl-crystal-epsonmc146.fzp",
|
|
84
|
+
"./core/sparkfun-freqctrl-resonator_nocap-.fzp",
|
|
85
|
+
"./core/sparkfun-led-led_ring-.fzp",
|
|
86
|
+
"./core/SparkFun Load Sensor Combinator.fzp",
|
|
87
|
+
"./core/sparkfun-passives-cap_adj-smd.fzp",
|
|
88
|
+
"./core/sparkfun-passives-fuse-x20mm.fzp",
|
|
89
|
+
"./core/sparkfun-passives-inductor-sru5028.fzp",
|
|
90
|
+
"./core/sparkfun-poweric-transformer-smd.fzp",
|
|
91
|
+
"./core/sparkfun-rf-mirf-.fzp",
|
|
92
|
+
"./core/sx1509-breakout.fzp",
|
|
93
|
+
"./core/Wireless_SD_v3.fzp",
|
|
94
|
+
"./obsolete/sparkfun-electromechanical-battery-2-aaa.fzp",
|
|
95
|
+
"./obsolete/sparkfun-electromechanical-battery-2-aa.fzp",
|
|
96
|
+
]
|
|
97
|
+
for i, item in enumerate(skip_files):
|
|
98
|
+
skip_files[i] = os.path.normpath(item)
|
|
99
|
+
return os.path.normpath(filename) in skip_files
|
|
100
|
+
|
|
101
|
+
def main():
|
|
102
|
+
try:
|
|
103
|
+
opts, args = getopt.getopt(sys.argv[1:], "hd:", ["help", "directory"])
|
|
104
|
+
except getopt.GetoptError as err:
|
|
105
|
+
# print help information and exit:
|
|
106
|
+
print(str(err)) # will print something like "option -a not recognized"
|
|
107
|
+
usage()
|
|
108
|
+
return -1
|
|
109
|
+
|
|
110
|
+
dir = None
|
|
111
|
+
|
|
112
|
+
for o, a in opts:
|
|
113
|
+
# print o
|
|
114
|
+
# print a
|
|
115
|
+
if o in ("-d", "--directory"):
|
|
116
|
+
dir = a
|
|
117
|
+
elif o in ("-h", "--help"):
|
|
118
|
+
usage()
|
|
119
|
+
return 0
|
|
120
|
+
else:
|
|
121
|
+
assert False, "unhandled option"
|
|
122
|
+
|
|
123
|
+
if(not(dir)):
|
|
124
|
+
usage()
|
|
125
|
+
return -1
|
|
126
|
+
|
|
127
|
+
pattern = r'(\d+)'
|
|
128
|
+
numberFinder = re.compile(pattern, re.IGNORECASE)
|
|
129
|
+
|
|
130
|
+
ret = 0
|
|
131
|
+
count = 0
|
|
132
|
+
for root, dirs, files in os.walk(dir, topdown=False):
|
|
133
|
+
for filename in files:
|
|
134
|
+
if not filename.endswith(".fzp"):
|
|
135
|
+
continue
|
|
136
|
+
|
|
137
|
+
fzpFilename = os.path.join(root, filename)
|
|
138
|
+
if skip(fzpFilename):
|
|
139
|
+
continue
|
|
140
|
+
|
|
141
|
+
count += 1
|
|
142
|
+
|
|
143
|
+
try:
|
|
144
|
+
dom = xml.dom.minidom.parse(fzpFilename)
|
|
145
|
+
except xml.parsers.expat.ExpatError as err:
|
|
146
|
+
print(str(err), fzpFilename)
|
|
147
|
+
continue
|
|
148
|
+
|
|
149
|
+
fzp = dom.documentElement
|
|
150
|
+
connectors = fzp.getElementsByTagName("connector")
|
|
151
|
+
gotInt = False
|
|
152
|
+
for connector in connectors:
|
|
153
|
+
try:
|
|
154
|
+
intname = int(connector.getAttribute("name"))
|
|
155
|
+
gotInt = True
|
|
156
|
+
except:
|
|
157
|
+
continue
|
|
158
|
+
|
|
159
|
+
if not gotInt:
|
|
160
|
+
continue
|
|
161
|
+
|
|
162
|
+
idZero = False
|
|
163
|
+
for connector in connectors:
|
|
164
|
+
try:
|
|
165
|
+
id = connector.getAttribute("id")
|
|
166
|
+
match = numberFinder.search(id)
|
|
167
|
+
if match == None:
|
|
168
|
+
continue
|
|
169
|
+
|
|
170
|
+
if match.group(1) == '0':
|
|
171
|
+
idZero = True
|
|
172
|
+
break
|
|
173
|
+
except:
|
|
174
|
+
continue
|
|
175
|
+
|
|
176
|
+
nameZero = False
|
|
177
|
+
for connector in connectors:
|
|
178
|
+
if connector.getAttribute("name") == "0":
|
|
179
|
+
nameZero = True
|
|
180
|
+
break
|
|
181
|
+
|
|
182
|
+
mismatches = []
|
|
183
|
+
for connector in connectors:
|
|
184
|
+
idInt = 0
|
|
185
|
+
nameInt = 0
|
|
186
|
+
try:
|
|
187
|
+
id = connector.getAttribute("id")
|
|
188
|
+
match = numberFinder.search(id)
|
|
189
|
+
if match == None:
|
|
190
|
+
continue
|
|
191
|
+
|
|
192
|
+
idInt = int(match.group(1))
|
|
193
|
+
nameInt = int(connector.getAttribute("name"))
|
|
194
|
+
|
|
195
|
+
except:
|
|
196
|
+
continue
|
|
197
|
+
|
|
198
|
+
mismatch = False
|
|
199
|
+
if nameZero and idZero:
|
|
200
|
+
mismatch = (idInt != nameInt)
|
|
201
|
+
elif nameZero:
|
|
202
|
+
mismatch = (idInt != nameInt + 1)
|
|
203
|
+
elif idZero:
|
|
204
|
+
mismatch = (idInt + 1 != nameInt)
|
|
205
|
+
else:
|
|
206
|
+
mismatch = (idInt != nameInt)
|
|
207
|
+
if mismatch:
|
|
208
|
+
mismatches.append(connector)
|
|
209
|
+
|
|
210
|
+
if len(mismatches) > 0:
|
|
211
|
+
ret = -1
|
|
212
|
+
print(fzpFilename, nameZero, idZero)
|
|
213
|
+
for connector in mismatches:
|
|
214
|
+
strings = connector.toxml().split("\n")
|
|
215
|
+
print(strings[0])
|
|
216
|
+
print()
|
|
217
|
+
|
|
218
|
+
if count == 0:
|
|
219
|
+
print("No files checked in ", dir)
|
|
220
|
+
ret = -2
|
|
221
|
+
else:
|
|
222
|
+
print("%s files checked" % count)
|
|
223
|
+
|
|
224
|
+
return ret
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
if __name__ == "__main__":
|
|
228
|
+
sys.exit(main())
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
## Common errors the CI reports on parts and their fixes
|
|
2
|
+
|
|
3
|
+
### Missing viewBox attribute
|
|
4
|
+
This error will appear if the SVG has no viewBox attribute. If there is no viewBox, Fritzing will apply some heuristic to
|
|
5
|
+
guess the DPI and therefore the physical size of the graphic. This can easily go wrong.
|
|
6
|
+
*Fix*
|
|
7
|
+
Add all three, viewBox, width, and height attributes. Specify the width and height in mm or inch.
|
|
8
|
+
|
|
9
|
+
### Invisible connector
|
|
10
|
+
This error appears if a connector does not have renderable objects in the SVG. This often works, because Fritzing
|
|
11
|
+
modifies connector graphics by setting a color and a stroke. This is error prone: Sometimes, adding a stroke
|
|
12
|
+
is not enough, and some tools and SVG parsers remove non-visible elements. And since the element is not rendered by
|
|
13
|
+
regular SVG editors, there is also a risk to overlook misplaced connectors.
|
|
14
|
+
*Fix*
|
|
15
|
+
It depends. Often there is another visible element that represents the connector and should be used instead.
|
|
16
|
+
Sometimes this is a true error in the SVG, e.g. from mixed up connector IDs. Or, if you want to omit a connector entirely in a view,
|
|
17
|
+
you can mark it as 'hybrid' connector in the FZP file.
|
|
18
|
+
|
|
19
|
+
### Duplicate id attribute
|
|
20
|
+
IDs in SVGs must be unique; some programs can not deal with duplicates. This often happens in the PCB view, when
|
|
21
|
+
the same ID is used for connectors in different layers. In these cases Fritzing usually is able to refer the correct
|
|
22
|
+
element via the layer id. However, this is very easy to mess up, since it is also confusing during editing the part.
|
|
23
|
+
There is no verification that Fritzing does this as intended in each and every place.
|
|
24
|
+
*Fix*
|
|
25
|
+
Carefully check how the duplicate was introduced, maybe it is just numbered wrong. Or de-duplicate, by attaching
|
|
26
|
+
underscore and number. For the PCB view, you can also nest the copper0 group within the copper1 group, and use the
|
|
27
|
+
same connector for both to have it in both layers.
|
|
28
|
+
|
|
29
|
+
### Invisible or missing terminal
|
|
30
|
+
This is one of the most common errors in Fritzing parts. If this error shows, Fritzing will use the center of the connector as
|
|
31
|
+
terminal.
|
|
32
|
+
*Fix*
|
|
33
|
+
Fritzing 1.0.3 will automatically set the terminal, unless a terminal explicitly specified in the FZP. Therefore,
|
|
34
|
+
the fix is almost always, to remove the terminal definition from the FZP and the SVG. If you still want to manually set
|
|
35
|
+
the exact terminal point, please make sure the terminal is visible. Avoid zero width and zero height.
|
|
36
|
+
|
|
37
|
+
### Unknown style attribute
|
|
38
|
+
SVG elements can have XML attributes, as well as CSS styles. Only a very small subset of CSS styles is supported by
|
|
39
|
+
Fritzing. If in doubt, it is usually better to use XML attributes.
|
|
40
|
+
|
|
41
|
+
Fritzing has some workarounds for the following styles:
|
|
42
|
+
```
|
|
43
|
+
fixStyleAttribute(element, style, "stroke-width");
|
|
44
|
+
fixStyleAttribute(element, style, "stroke");
|
|
45
|
+
fixStyleAttribute(element, style, "fill");
|
|
46
|
+
fixStyleAttribute(element, style, "fill-opacity");
|
|
47
|
+
fixStyleAttribute(element, style, "stroke-opacity");
|
|
48
|
+
fixStyleAttribute(element, style, "font-size");
|
|
49
|
+
fixStyleAttribute(element, style, "stroke-dasharray");
|
|
50
|
+
```
|
|
51
|
+
These are automatically transformed into XML attributes.
|
|
52
|
+
Remaining styles are passed on to Qt renderer, which officially does not support them.
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
### Style conflict
|
|
56
|
+
|
|
57
|
+
In some cases, CSS styles and XML attributes may be conflicting. The rendered result is hard to predict,
|
|
58
|
+
since XML does not specify a strict ordering for attributes. Please resolve the conflict manually, by
|
|
59
|
+
only using a XML attribute.
|
|
60
|
+
|
|
61
|
+
### Property has an empty value
|
|
62
|
+
You can check the inspector how the properties are applied.
|
|
63
|
+
|
|
64
|
+
Example:
|
|
65
|
+
```
|
|
66
|
+
Error: Property 'part number' has an empty value.
|
|
67
|
+
Error: Property 'layer' has an empty value.
|
|
68
|
+
Error: Property 'hole size' has an empty value.
|
|
69
|
+
Error: Property 'mn' has an empty value.
|
|
70
|
+
Error: Property 'mpn' has an empty value.
|
|
71
|
+
```
|
|
72
|
+
Custom parts currently can't configure the hole size. So you might as well remove it.
|
|
73
|
+
Without a value, listing properties in the part will often have no effect.
|
|
74
|
+
If you provide a default value, it should actually show as a default in the inspector.
|
|
75
|
+
|
|
76
|
+

|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
### Layer ID 'icon' from iconView not found in SVG file
|
|
80
|
+
This usually happens if you use the breadboard image as icon.
|
|
81
|
+
This is often not the best solution, because the breadboard image
|
|
82
|
+
is difficult to recognize at icon size.
|
|
83
|
+
It is better to have a separate icon file,
|
|
84
|
+
showing some characteristic region of interest,
|
|
85
|
+
like a cropped version of the breadboard image.
|
|
86
|
+
|
|
87
|
+
### Process completed with exit code 255
|
|
88
|
+
This is just the CI telling us that some error has happened before.
|
|
89
|
+
|
|
90
|
+
## Error not listed here, or still unclear?
|
|
91
|
+
|
|
92
|
+
If you think that an error is a false alert, or unsure what the error means or how to fix it, please open an issue at
|
|
93
|
+
github.com/fritzing/fritzing-parts . If possible provide a link to your CI run, the pull request, and the part file,
|
|
94
|
+
along with a copy of the error message, and a description of what you already tried.
|
|
95
|
+
|