Sync with main branch r6538
This commit is contained in:
commit
b7a8661a03
|
@ -648,6 +648,7 @@ WARN_LOGFILE =
|
|||
|
||||
INPUT = coding-style-policy.md \
|
||||
stable-release-policy.md \
|
||||
road-map-r5.md \
|
||||
road-map.md \
|
||||
compiling.md
|
||||
|
||||
|
|
|
@ -0,0 +1,718 @@
|
|||
# Version 5 Road Map # {#v5_road_map}
|
||||
|
||||
This document is the KiCad version 5 Developer's road map document. It is
|
||||
living document that should be maintained during the version 5 development
|
||||
cycle. The goal of this document is to provide an overview for developers
|
||||
of the goals for the project for the version 5 release of KiCad. It is
|
||||
broken into sections for each major component of the KiCad source code and
|
||||
documentation. It defines tasks that developers an use to contribute to the
|
||||
project and provides updated status information. Tasks should define clear
|
||||
objectives and avoid vague generalizations so that a new developer can complete
|
||||
the task. It is not a place for developers to add their own personal wish.
|
||||
list. It should only be updated with approval of the project manager after
|
||||
discussion with the lead developers.
|
||||
|
||||
Each entry in the road map is made up of four sections. The goal should
|
||||
be a brief description of the what the road map entry will accomplish. The
|
||||
task section should be a list of deliverable items that are specific enough
|
||||
hat they can be documented as completed. The dependencies sections is a list
|
||||
of requirements that must be completed before work can begin on any of the
|
||||
tasks. The status section should include a list of completed tasks or marked
|
||||
as complete as when the goal is met.
|
||||
|
||||
[TOC]
|
||||
|
||||
# Project # {#v5_project}
|
||||
This section defines the tasks for the project related goals that are not
|
||||
related to coding or documentation. It is a catch all for issues such as
|
||||
developer and user relations, dissemination of information on websites,
|
||||
policies, etc.
|
||||
|
||||
|
||||
# General # {#v5_general}
|
||||
This section defines the tasks that affect all or most of KiCad or do not
|
||||
fit under as specific part of the code such as the board editor or the
|
||||
schematic editor.
|
||||
|
||||
## Create Schematic Code Shared Object. ## {#v5_kiway}
|
||||
**Goal:**
|
||||
|
||||
Merge common schematic code into to a separate shared object to allow access
|
||||
to schematic objects by third party code and Python support.
|
||||
|
||||
**Task:**
|
||||
|
||||
**Dependencies:**
|
||||
- None
|
||||
|
||||
**Status:**
|
||||
- No Progress.
|
||||
|
||||
## User Interface Modernization ## {#v5_wxaui}
|
||||
**Goal:**
|
||||
|
||||
Give KiCad a more modern user interface with dockable tool bars and windows.
|
||||
Create perspectives to allow users to arrange dockable windows as they prefer.
|
||||
|
||||
**Task:**
|
||||
- Take advantage of the advanced UI features in wxAui such as detaching and
|
||||
hiding.
|
||||
- Study ergonomics of various commercial/proprietary PCB applications (when
|
||||
in doubt about any particular UI solution, check how it has been done in a
|
||||
certain proprietary app that is very popular among OSHW folks and do exactly
|
||||
opposite).
|
||||
- Clean up menu structure. Menus must allow access to all features of the
|
||||
program in a clear and logical way. Currently some functions of Pcbnew are
|
||||
accessible only through tool bars
|
||||
- Redesign dialogs, make sure they are following same style rules.
|
||||
- Check quality of translations. Either fix or remove bad quality translations.
|
||||
- Develop a global shortcut manager that allows the user assign arbitrary
|
||||
shortcuts for any tool or action.
|
||||
|
||||
**Dependencies:**
|
||||
- [wxWidgets 3](#wxwidgets3)
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
## Regular Expression Library Search ## {#v5_gen_lib_reg_ex}
|
||||
|
||||
**Goal:**
|
||||
Add regular expression and wildcard searching to component and footprint
|
||||
library search dialogs.
|
||||
|
||||
**Task:**
|
||||
- Add implementation to component and footprint search dialogs.
|
||||
|
||||
**Dependencies:**
|
||||
- None
|
||||
|
||||
**Status:**
|
||||
- Initial container searching code completed.
|
||||
- Searching implemented in component library search dialog.
|
||||
- Needs to be added to footprint library search dialog in CvPcb and Pcbnew.
|
||||
|
||||
# Build Tools # {#v5_build_tools}
|
||||
This section covers build tools for both the KiCad source as well as the
|
||||
custom dependency builds required to build KiCad.
|
||||
|
||||
## Create Separate Build Dependency Project ## {#v5_depends_prj}
|
||||
**Goal:**
|
||||
|
||||
Move the library dependencies and their patches into a separate project to
|
||||
developers to build and install them as required instead of requiring them
|
||||
at build time. Give developers the flexibility to build and/or install
|
||||
library dependencies as they see fit. Remove them from the KiCad source code
|
||||
to reduce the build footprint.
|
||||
|
||||
**Task:**
|
||||
- Create a separate project to build all external dependency libraries that are
|
||||
currently build from source (Boost, OpenSSL, etc).
|
||||
- Use CMake to create a package configuration file for each library so the
|
||||
KiCad find package can pull in header paths, library dependencies, compile
|
||||
flags, and link flags to build KiCad.
|
||||
- Use CMake find package to pull external dependencies.
|
||||
- Remove all build from source dependencies for KiCad source code.
|
||||
|
||||
**Dependencies:**
|
||||
- None
|
||||
|
||||
**Status:**
|
||||
- In progress.
|
||||
|
||||
|
||||
# Common Library # {#v5_common_lib}
|
||||
This section covers the source code shared between all of the KiCad
|
||||
applications
|
||||
|
||||
## Unified Rendering Framework ## {#v5_unified_rendering}
|
||||
**Goal:**
|
||||
|
||||
Provide a single framework for developing new tools. Port existing tools
|
||||
to the new framework and remove the legacy framework tools.
|
||||
|
||||
**Task:**
|
||||
- Port wxDC to GAL or get Cairo rendering to nearly the performance of the
|
||||
current wxDC rendering so that we have a single framework to develop new
|
||||
tools and we can continue to support systems that don't have a complete
|
||||
OpenGL stack.
|
||||
|
||||
**Dependencies**
|
||||
- [Tool framework](http://www.ohwr.org/projects/cern-kicad/wiki/WorkPackages)
|
||||
|
||||
**Status**
|
||||
- In progress
|
||||
|
||||
## Linux Printing Improvements ## {#v5_linux_print}
|
||||
**Goal:**
|
||||
|
||||
Bring printing on Linux up to par with printing on Windows.
|
||||
|
||||
**Task:**
|
||||
- Resolve Linux printing issues.
|
||||
|
||||
**Dependencies**
|
||||
- [wxWidgets 3](#wxwidgets3)
|
||||
|
||||
**Status**
|
||||
- No progress.
|
||||
|
||||
## Object Properties and Introspection ## {#v5_object_props}
|
||||
**Goal:**
|
||||
|
||||
Provide an object introspection system using properties.
|
||||
|
||||
**Task:**
|
||||
- Select existing or develop property system.
|
||||
- Add definable properties to base objects.
|
||||
- Create introspection framework for manipulating object properties.
|
||||
- Serialization of properties to and from files and/or other I/O structures.
|
||||
- Create tool to edit property name/type/value table.
|
||||
|
||||
**Dependencies:**
|
||||
- None
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
## Dynamic Library Plugin ## {#v5_plugin_base}
|
||||
**Goal:**
|
||||
|
||||
Create a base library plugin for handling external file I/O. This will allow
|
||||
plugins to be provided that are external to the project such as providing solid
|
||||
model file support (STEP, IGES, etc.) using OpenCascade without making it a
|
||||
project dependency.
|
||||
|
||||
**Task:**
|
||||
- Create a plugin to handle dynamically registered plugins for loading and
|
||||
saving file formats.
|
||||
- This object should be flexible enough to be extended for handling all file
|
||||
plugin types including schematic, board, footprint library, component
|
||||
library, etc.
|
||||
- See [blueprint](https://blueprints.launchpad.net/kicad/+spec/pluggable-file-io)
|
||||
on Launchpad for more information.
|
||||
|
||||
**Dependencies:**
|
||||
- None
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
|
||||
# KiCad: Application Launcher # {#v5_kicad}
|
||||
This section applies to the source code for the KiCad application launcher.
|
||||
|
||||
|
||||
# Eeschema: Schematic Editor # {#v5_eeschema}
|
||||
This section applies to the source code for the Eeschema schematic editor.
|
||||
|
||||
## Coherent SCHEMATIC Object ## {#v5_sch_object}
|
||||
**Goal:**
|
||||
|
||||
Clean up the code related to the schematic object(s) into a coherent object for
|
||||
managing and manipulating the schematic.
|
||||
|
||||
**Task:**
|
||||
- Move most if not all of the code from SCH_SCREEN to the new SCHEMATIC object.
|
||||
- Add any missing functionality to the SCHEMATIC object.
|
||||
|
||||
**Dependencies:**
|
||||
- None
|
||||
|
||||
**Status:**
|
||||
- In progress.
|
||||
|
||||
## Hierarchical Sheet Design ## {#v5_hierarchy_fix}
|
||||
**Goal:**
|
||||
|
||||
Create a more robust sheet instance design rather than recreating them on the
|
||||
fly every time sheet information is required.
|
||||
|
||||
**Task:**
|
||||
- Choose a data structure to contain the sheet hierarchy.
|
||||
- Create helper class to manipulate the hierarchy data structure.
|
||||
|
||||
**Dependencies:**
|
||||
- None
|
||||
|
||||
**Status:**
|
||||
- In progress.
|
||||
|
||||
## Schematic and Component Library Plugin ## {#v5_sch_plugin}
|
||||
**Goal:**
|
||||
Create a plugin manager for loading and saving schematics and component
|
||||
libraries similar to the board plugin manager.
|
||||
|
||||
**Task:**
|
||||
- Design plugin manager for schematics and component libraries.
|
||||
- Port the current schematic and component library file formats to use the
|
||||
plugin.
|
||||
|
||||
**Dependencies:**
|
||||
- [Dynamic library plugin](#v5_plugin_base)
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
## Graphics Abstraction Layer Conversion ## {#v5_sch_gal}
|
||||
**Goal:**
|
||||
|
||||
Take advantage of advanced graphics rendering in Eeschema.
|
||||
|
||||
**Task:**
|
||||
- Port graphics rendering to GAL.
|
||||
|
||||
**Dependencies:**
|
||||
- None
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
## Port Editing Tools ## {#v5_sch_tool_framework}
|
||||
**Goal:**
|
||||
|
||||
Use standard tool framework across all applications.
|
||||
|
||||
**Task:**
|
||||
- Rewrite editing tools using the new tool framework.
|
||||
|
||||
**Dependencies:**
|
||||
- [GAL port](#v5_sch_gal).
|
||||
|
||||
**Status:**
|
||||
- Initial Discussion..
|
||||
|
||||
## S-Expression File Format ## {#v5_sch_sexpr}
|
||||
**Goal:**
|
||||
|
||||
Make schematic file format more readable, add new features, and take advantage
|
||||
of the s-expression capability used in Pcbnew.
|
||||
|
||||
**Task:**
|
||||
- Finalize feature set and file format.
|
||||
- Discuss the possibility of dropping the unit-less proposal temporarily to get
|
||||
the s-expression file format and SWEET library format implemented without
|
||||
completely rewriting Eeschema.
|
||||
- Add new s-expression file format to plugin.
|
||||
|
||||
**Dependencies:**
|
||||
- [Dynamic library plugin](#v5_plugin_base).
|
||||
|
||||
**Status:**
|
||||
- File format document nearly complete.
|
||||
|
||||
## Implement Sweet Component Libraries ## {#v5_sch_sweet}
|
||||
**Goal:**
|
||||
|
||||
Make component library design more robust and feature rich. Use s-expressions
|
||||
to make component library files more readable.
|
||||
|
||||
**Task:**
|
||||
- Use sweet component file format for component libraries.
|
||||
|
||||
**Dependencies:**
|
||||
- [S-expression file format](#v5_sch_sexpr).
|
||||
|
||||
**Status:**
|
||||
- Initial SWEET library written.
|
||||
|
||||
## Component Library Editor Usability Improvements ## {#v5_lib_editor_usability}
|
||||
**Goal:**
|
||||
|
||||
Make editing components with multiple units and/or alternate graphical
|
||||
representations easier.
|
||||
|
||||
**Task:**
|
||||
- Determine usability improvements in the library editor for components with
|
||||
multiple units and/or alternate graphical representations.
|
||||
- Implement said usability improvements.
|
||||
|
||||
**Dependencies:**
|
||||
- None.
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
## Component and Netlist Attributes ## {#v5_netlist_attributes}
|
||||
**Goal:**
|
||||
Provide a method of passing information to other tools via the net list.
|
||||
|
||||
**Task:**
|
||||
- Add virtual components and attributes to netlist to define properties that
|
||||
can be used by other tools besides the board editor.
|
||||
|
||||
**Dependencies:**
|
||||
- [S-expression schematic file format](#v5_sch_sexpr).
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
## Net Highlighting ## {#v5_sch_net_highlight}
|
||||
**Goal:**
|
||||
Highlight wires, buses, and junctions when corresponding net in Pcbnew is selected.
|
||||
|
||||
**Task:**
|
||||
- Add communications link to handle net selection from Pcbnew.
|
||||
- Implement highlight algorithm for net objects.
|
||||
- Highlight objects connected to net selected in Pcbnew.
|
||||
|
||||
**Dependencies:**
|
||||
- [GAL port, maybe](#v5_sch_gal).
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
## Move Common Schematic Code into a Shared Object ## {#v5_sch_shared_object}
|
||||
**Goal:**
|
||||
Refactor all schematic object code so that it can be built into a shared object
|
||||
for use by the schematic editor, Python module, and linked into third party
|
||||
programs.
|
||||
|
||||
**Task**
|
||||
- Split schematic object code from schematic and component editor code.
|
||||
- Generate shared object from schematic object code.
|
||||
- Update build configuration to build schematic and component editors
|
||||
against new schematic shared object.
|
||||
|
||||
**Dependencies:**
|
||||
- None
|
||||
|
||||
**Progress:**
|
||||
- No progress.
|
||||
|
||||
# CvPcb: Footprint Association Tool # {#v5_cvpcb}
|
||||
This section covers the source code of the footprint assignment tool CvPcb.
|
||||
|
||||
## Improved Footprint Search Tool ## {#v5_cvpcb_search}
|
||||
|
||||
**Goal:**
|
||||
Provide advanced search features such as wild card and regular expression
|
||||
searches using the type as you go feature of the current search dialog.
|
||||
|
||||
**Task:**
|
||||
- Add code for wild card and regular expression pattern matching to search
|
||||
container objects.
|
||||
- Add search dialog to CvPcb to search container of footprint names.
|
||||
|
||||
**Dependencies:**
|
||||
- None
|
||||
|
||||
**Status:**
|
||||
- Pattern matching added to search container objects.
|
||||
|
||||
## Add Progress Dialog on Start Up ## {#v5_cvpcb_progress}
|
||||
|
||||
**Goal:**
|
||||
Provide user feedback when loading footprint libraries are loading after
|
||||
start up.
|
||||
|
||||
**Task:**
|
||||
- Create a progress dialog to show the percentage of libraries loaded.
|
||||
|
||||
**Dependencies:**
|
||||
- None
|
||||
|
||||
**Status:**
|
||||
- No Progress
|
||||
|
||||
# Pcbnew: Circuit Board Editor # {#v5_pcbnew}
|
||||
This section covers the source code of the board editing application Pcbnew.
|
||||
|
||||
## Tool Framework ## {#v5_pcb_tool_framework}
|
||||
**Goal:**
|
||||
|
||||
Unify all board editing tools under a single framework.
|
||||
|
||||
**Task:**
|
||||
- Complete porting of all board editing tools to new tool framework so they
|
||||
are available in the OpenGL and Cairo canvases.
|
||||
- Remove all duplicate legacy editing tools.
|
||||
|
||||
**Dependencies:**
|
||||
- In progress.
|
||||
|
||||
**Status:**
|
||||
- Initial porting work in progress.
|
||||
|
||||
## Linked Objects ## {#v5_pcb_linked_objects}
|
||||
**Goal:**
|
||||
|
||||
Provide a way to allow external objects such as footprints to be externally
|
||||
linked in the board file so that changes in the footprint are automatically
|
||||
updated. This will allow a one to many object relationship which can pave
|
||||
the way for reusable board modules.
|
||||
|
||||
**Task:**
|
||||
- Add externally and internally linked objects to the file format to allow for
|
||||
footprints and/or other board objects to be shared (one to many relationship)
|
||||
instead of only supporting embedded objects (one to one relationship) that
|
||||
can only be edited in place.
|
||||
|
||||
**Dependencies:**
|
||||
- None.
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
## Modeling ## {#v5_modeling}
|
||||
|
||||
**Goal:**
|
||||
Provide improved solid modeling support for KiCad including the file formats
|
||||
available in OpenCascade.
|
||||
|
||||
**Task:**
|
||||
- Improve low level code design.
|
||||
- Design plugin architecture to handle loading and saving 3D models.
|
||||
- Back port existing 3D formats (IDF and S3D) to plugin
|
||||
- Add STEP 3D modeling capability.
|
||||
- Add IGES 3D modeling capability.
|
||||
|
||||
**Dependencies:**
|
||||
- [Dynamic library plugin](#v5_plugin_base).
|
||||
|
||||
**Status:**
|
||||
- 3D Viewer work in progress. There is also now and external tool [KiCadStepUp]
|
||||
(http://sourceforge.net/projects/kicadstepup/) which allows [FreeCAD]
|
||||
(http://www.freecadweb.org/) to create parametric models from KiCad board
|
||||
files.
|
||||
|
||||
## Push and Shove Router Improvements ## {#v5_ps_router_improvements}
|
||||
|
||||
**Goal:**
|
||||
Add features such as microwave tools to the P&S router.
|
||||
|
||||
**Task:**
|
||||
- Determine which features are feasible.
|
||||
- Look at the recently opened FreeRouter code at
|
||||
http://www.freerouting.net/fen/download/file.php?id=146 for inspiration.
|
||||
|
||||
**Dependencies:**
|
||||
- None
|
||||
|
||||
**Status:**
|
||||
- No Progress.
|
||||
|
||||
## Pin and Part Swapping ## {#v5_pcb_drc}
|
||||
**Goal:**
|
||||
|
||||
Allow Pcbnew to perform pin and/or part swapping during layout so the user
|
||||
does not have to do it in Eeschema and re-import the net list.
|
||||
|
||||
**Task:**
|
||||
- Provide forward and back annotation between the schematic and board editors.
|
||||
- Define netlist file format changes required to handle pin/part swapping.
|
||||
- Update netlist file formatter and parser to handle file format changes.
|
||||
- Develop a netlist comparison engine that will produce a netlist diff that
|
||||
can be passed between the schematic and board editors.
|
||||
- Create pin/part swap dialog to manipulate swappable pins and parts.
|
||||
- Add support to handle net label back annotation changes.
|
||||
|
||||
**Dependencies:**
|
||||
- [S-expression schematic file format](#v5_sch_sexpr).
|
||||
- [Convert to a single process application](#v5_kiway).
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
## Intelligent Selection Tool ## {#v5_pcb_selection_tool}
|
||||
**Goal:**
|
||||
|
||||
Make the selection tool easier for the user to determine which object(s) are
|
||||
being selected.
|
||||
|
||||
**Task:**
|
||||
- Determine and define the actual desired behavior.
|
||||
- Improve ambiguous selections when multiple items are under the cursor or in
|
||||
the selection bounding box.
|
||||
|
||||
**Dependencies:**
|
||||
- Tool framework.
|
||||
- Unified geometry library.
|
||||
|
||||
**Status:**
|
||||
- Initial design committed to product branch.
|
||||
|
||||
## Clipboard Support ## {#v5_fp_edit_clipboard}
|
||||
**Goal:**
|
||||
|
||||
Provide clipboard cut and paste for footprint management in the footprint
|
||||
editor.
|
||||
|
||||
**Task:**
|
||||
- Clipboard cut and paste to and from clipboard of footprints in footprint
|
||||
editor.
|
||||
|
||||
**Dependencies:**
|
||||
- None
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
## Design Rule Check (DRC) Improvements. ## {#v5_drc_improvements}
|
||||
**Goal:**
|
||||
|
||||
Create additional DRC tests for improved error checking.
|
||||
|
||||
**Task:**
|
||||
- Replace geometry code with [unified geometry library](#v5_geometry_lib).
|
||||
- Remove floating point code from clearance calculations to prevent rounding
|
||||
errors.
|
||||
- Add checks for component, silk screen, and mask clearances.
|
||||
- Add checks for vias in zones for proper connections without having to add
|
||||
traces.
|
||||
- Add checks for keep out zones.
|
||||
- Remove DRC related limitations such as no arc or text on copper layers.
|
||||
- Add option for saving and loading DRC options.
|
||||
|
||||
**Dependencies:**
|
||||
- [Unified geometry library.](#v5_geometry_lib)
|
||||
|
||||
**Progress:**
|
||||
- Planning
|
||||
|
||||
## Segment End Point Snapping. ## {#v5_segment_snapping}
|
||||
**Goal:**
|
||||
|
||||
It is not uncommon for board edge segment end points to inadvertently not
|
||||
be closed causing issues for the 3D viewer and exporting to different file
|
||||
formats due the board outline not being a fully enclosed polygon. This
|
||||
feature would add segment end snapping support to allow the board outline
|
||||
to be fully enclosed. This feature would only need to be supported by the
|
||||
GAL rendering.
|
||||
|
||||
**Tasks**
|
||||
- Mark board edge segment ends with a drag indicator to make it visible to the
|
||||
user that the segment end does not have an endpoint with any other board edge
|
||||
segment.
|
||||
- Allow the user to snap the unconnected segment end to the nearest segment end
|
||||
point.
|
||||
- Automatically connect unconnected segments with and additional segment when
|
||||
opening the 3D viewer or exporting the board to another format. Warn the
|
||||
user that an addition segment has be added and should be verified.
|
||||
|
||||
**Dependencies:**
|
||||
- None
|
||||
|
||||
**Progress:**
|
||||
- Initial discussion.
|
||||
|
||||
## Keepout Zones. ## {#v5_keepout_zones}
|
||||
**Goal:**
|
||||
|
||||
Add support for keepout zones on boards and footprints.
|
||||
|
||||
**Task:**
|
||||
- Add keepout support to zone classes.
|
||||
- Add keepout zone support to board editor.
|
||||
- Add keepout zone support to library editor.
|
||||
|
||||
**Dependencies:**
|
||||
- [DRC Improvements.](#v5_drc_improvements)
|
||||
|
||||
**Progress:**
|
||||
- Planning
|
||||
|
||||
## Net Highlighting ## {#v5_pcb_net_highlight}
|
||||
**Goal:**
|
||||
Highlight rats nest links and/or traces when corresponding net in Eeschema is selected.
|
||||
|
||||
**Task:**
|
||||
- Add communications link to handle net selection from Eeschema.
|
||||
- Implement highlight algorithm for objects connected to the selected net.
|
||||
- Highlight objects connected to net selected in Eeschema
|
||||
|
||||
**Dependencies:**
|
||||
- None.
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
## Complex Pad Shapes "" {#v5_pcb_complex_pads}
|
||||
**Goal:**
|
||||
Add capability to create complex pad shapes from existing primitives such as arcs,
|
||||
segments, and circles or polygons.
|
||||
|
||||
**Task:**
|
||||
- Add new complex pad type.
|
||||
- Add code to load and save complex pad type.
|
||||
- Add code to convert complex pad type to polygon for DRC testing.
|
||||
- Add code to DRC to support complex pad types.
|
||||
- Add code to footprint editor to create complex pad types.
|
||||
|
||||
**Dependencies:**
|
||||
- [Unified geometry library.](#v5_geometry_lib)
|
||||
|
||||
**Progress:**
|
||||
- In progress.
|
||||
|
||||
|
||||
# GerbView: Gerber File Viewer # {#v5_gerbview}
|
||||
|
||||
This section covers the source code for the GerbView gerber file viewer.
|
||||
|
||||
## Graphics Abstraction Layer ## {#v5_gerbview_gal}
|
||||
**Goal:**
|
||||
|
||||
Graphics rendering unification.
|
||||
|
||||
**Task:**
|
||||
- Port graphics rendering layer to GAL.
|
||||
|
||||
**Dependencies:**
|
||||
- None.
|
||||
|
||||
**Status**
|
||||
- No progress.
|
||||
|
||||
# Documentation # {#v5_documentation}
|
||||
This section defines the tasks for both the user and developer documentation.
|
||||
|
||||
## Grammar Check ## {#v5_doc_grammar}
|
||||
**Goal:**
|
||||
|
||||
Improve user documentation readability and make life easier to for translators.
|
||||
|
||||
**Task:**
|
||||
- Review and revise all of the English documentation so that it is update with
|
||||
the current functionality of the code.
|
||||
- Translate the update documentation into other languages.
|
||||
|
||||
**Dependencies:**
|
||||
- None
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
## Maintenance ## {#v5_doc_maintenance}
|
||||
**Task:**
|
||||
- Keep screen shots current with the source changes.
|
||||
|
||||
**Dependencies:**
|
||||
- None.
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
## Convert Developer Documentation to Markup/down Format ## {#v5_dev_doc_format}
|
||||
**Goal:**
|
||||
|
||||
Improve developers documentation to make life easier for new developers to get
|
||||
involved with the project.
|
||||
|
||||
**Task:**
|
||||
- Convert platform build instructions from plain text to new format to be
|
||||
merged with the developer documentation.
|
||||
- Convert how to contribute to KiCad instructions from plain text to the new
|
||||
format to merged with the developer documentation.
|
||||
|
||||
**Dependencies:**
|
||||
- None.
|
||||
|
||||
**Status:**
|
||||
- In progress. Most of the developer documentation has been convert to
|
||||
[Doxygen markdown](http://www.stack.nl/~dimitri/doxygen/manual/markdown.html)
|
||||
and the [output][kicad-docs] is rebuilt automatically when a commit is
|
||||
made to the KiCad repo.
|
||||
|
||||
[kicad-website]:http://kicad-pcb.org/
|
||||
[kicad-docs]:http://ci.kicad-pcb.org/job/kicad-doxygen/ws/Documentation/doxygen/html/index.html
|
1
Doxyfile
1
Doxyfile
|
@ -647,6 +647,7 @@ WARN_LOGFILE =
|
|||
|
||||
INPUT = Documentation/development/coding-style-policy.md \
|
||||
Documentation/development/stable-release-policy.md \
|
||||
Documentation/development/road-map-r5.md \
|
||||
Documentation/development/road-map.md \
|
||||
Documentation/development/compiling.md \
|
||||
kicad \
|
||||
|
|
|
@ -475,10 +475,11 @@ void SCH_EDIT_FRAME::PasteListOfItems( wxDC* DC )
|
|||
if( srcFn.IsRelative() )
|
||||
srcFn.MakeAbsolute( Prj().GetProjectPath() );
|
||||
|
||||
SCH_SHEET_LIST sheetHierarchy( sheet );
|
||||
std::vector< std::vector< const SCH_SHEET* > > sheetHierarchy;
|
||||
sheet->GetSheetPaths( sheetHierarchy );
|
||||
|
||||
if( hierarchy.TestForRecursion( sheetHierarchy,
|
||||
destFn.GetFullPath( wxPATH_UNIX ) ) )
|
||||
if( g_RootSheet->TestForRecursion( sheetHierarchy,
|
||||
destFn.GetFullPath( wxPATH_UNIX ) ) )
|
||||
{
|
||||
wxString msg;
|
||||
|
||||
|
|
|
@ -1187,10 +1187,31 @@ unsigned SCH_SHEET::GetSheets( std::vector<const SCH_SHEET*>& aSheetList ) const
|
|||
}
|
||||
|
||||
|
||||
SCH_SHEET* SCH_SHEET::GetRootSheet()
|
||||
void SCH_SHEET::GetSheetPaths( std::vector< std::vector< const SCH_SHEET* > >& aSheetPaths ) const
|
||||
{
|
||||
static std::vector< const SCH_SHEET* > path;
|
||||
|
||||
path.push_back( const_cast< SCH_SHEET* >( this ) );
|
||||
aSheetPaths.push_back( path );
|
||||
|
||||
SCH_ITEM* item = m_screen->GetDrawItems();
|
||||
|
||||
while( item )
|
||||
{
|
||||
if( item->Type() == SCH_SHEET_T )
|
||||
( (SCH_SHEET*) item )->GetSheetPaths( aSheetPaths );
|
||||
|
||||
item = item->Next();
|
||||
}
|
||||
|
||||
path.pop_back();
|
||||
}
|
||||
|
||||
|
||||
const SCH_SHEET* SCH_SHEET::GetRootSheet() const
|
||||
{
|
||||
EDA_ITEM* parent = GetParent();
|
||||
SCH_SHEET* rootSheet = this;
|
||||
const SCH_SHEET* rootSheet = const_cast< SCH_SHEET* >( this );
|
||||
|
||||
while( parent )
|
||||
{
|
||||
|
@ -1200,7 +1221,7 @@ SCH_SHEET* SCH_SHEET::GetRootSheet()
|
|||
parent = parent->GetParent();
|
||||
}
|
||||
|
||||
return rootSheet;
|
||||
return const_cast< SCH_SHEET* >( rootSheet );
|
||||
}
|
||||
|
||||
|
||||
|
@ -1582,6 +1603,88 @@ int SCH_SHEET::operator-( const SCH_SHEET& aRhs ) const
|
|||
}
|
||||
|
||||
|
||||
bool SCH_SHEET::TestForRecursion( std::vector< std::vector< const SCH_SHEET* > >& aSrcSheetHierarchy,
|
||||
const wxString& aDestFileName ) const
|
||||
{
|
||||
std::vector< std::vector< const SCH_SHEET* > > hierarchy;
|
||||
wxFileName rootFn = GetRootSheet()->GetFileName();
|
||||
wxFileName destFn = aDestFileName;
|
||||
|
||||
if( destFn.IsRelative() )
|
||||
destFn.MakeAbsolute( rootFn.GetPath() );
|
||||
|
||||
GetRootSheet()->GetSheetPaths( hierarchy );
|
||||
|
||||
// Test each SCH_SHEET_PATH in this SCH_SHEET_LIST for potential recursion.
|
||||
for( unsigned i = 0; i < hierarchy.size(); i++ )
|
||||
{
|
||||
// Test each SCH_SHEET_PATH in the source sheet.
|
||||
for( unsigned j = 0; j < aSrcSheetHierarchy.size(); j++ )
|
||||
{
|
||||
std::vector< const SCH_SHEET* > sheetPath = aSrcSheetHierarchy[ j ];
|
||||
|
||||
for( unsigned k = 0; k < sheetPath.size(); k++ )
|
||||
{
|
||||
wxFileName srcFn = sheetPath[k]->GetFileName();
|
||||
|
||||
if( srcFn.IsRelative() )
|
||||
srcFn.MakeAbsolute( rootFn.GetPath() );
|
||||
|
||||
// The source and destination sheet file names cannot be the same.
|
||||
if( srcFn == destFn )
|
||||
return true;
|
||||
|
||||
/// @todo Store sheet file names with full path, either relative to project path
|
||||
/// or absolute path. The current design always assumes subsheet files are
|
||||
/// located in the project folder which may or may not be desirable.
|
||||
std::vector< const SCH_SHEET* > destPath = hierarchy[i];
|
||||
unsigned l = 0;
|
||||
|
||||
while( l < destPath.size() )
|
||||
{
|
||||
wxFileName cmpFn = destPath[i]->GetFileName();
|
||||
|
||||
if( cmpFn.IsRelative() )
|
||||
cmpFn.MakeAbsolute( rootFn.GetPath() );
|
||||
|
||||
// Test if the file name of the destination sheet is in anywhere in the
|
||||
// source sheet path.
|
||||
if( cmpFn == destFn )
|
||||
break;
|
||||
|
||||
l++;
|
||||
}
|
||||
|
||||
// The destination sheet file name was not found in the any of the source sheet
|
||||
// path or the destination sheet file name is the root sheet so no recursion is
|
||||
// possible.
|
||||
if( l >= destPath.size() || l == 0 )
|
||||
return false;
|
||||
|
||||
// Walk back up to the root sheet to see if the source file name is already a
|
||||
// parent in destination the sheet path. If so, recursion will occur.
|
||||
do
|
||||
{
|
||||
l -= 1;
|
||||
|
||||
wxFileName cmpFn = destPath[i]->GetFileName();
|
||||
|
||||
if( cmpFn.IsRelative() )
|
||||
cmpFn.MakeAbsolute( rootFn.GetPath() );
|
||||
|
||||
if( cmpFn == srcFn )
|
||||
return true;
|
||||
|
||||
} while( l != 0 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// The source sheet file can safely be added to the destination sheet file.
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
#if defined(DEBUG)
|
||||
|
||||
void SCH_SHEET::Show( int nestLevel, std::ostream& os ) const
|
||||
|
|
|
@ -250,6 +250,8 @@ class SCH_SHEET : public SCH_ITEM
|
|||
// than assigned in the order the sheets were parsed and loaded.
|
||||
int m_number;
|
||||
|
||||
SCH_SHEET* getRootSheet();
|
||||
|
||||
public:
|
||||
SCH_SHEET( const wxPoint& pos = wxPoint( 0, 0 ) );
|
||||
|
||||
|
@ -599,6 +601,18 @@ public:
|
|||
*/
|
||||
unsigned GetSheets( std::vector<const SCH_SHEET*>& aSheetList ) const;
|
||||
|
||||
/**
|
||||
* Function GetSheetPaths
|
||||
*
|
||||
* Returns a list of lists of #SCH_SHEET pointers to \a sSheetPaths.
|
||||
*
|
||||
* This is analagous to the old SCH_SHEET_LIST::BuildSheetList(). It creates a list of
|
||||
* stacks to the sheet pointer hierarchy.
|
||||
*
|
||||
* @param aSheetPaths is a vector of vector of #SCH_SHEET pointers.
|
||||
*/
|
||||
void GetSheetPaths( std::vector< std::vector< const SCH_SHEET* > >& aSheetPaths ) const;
|
||||
|
||||
/**
|
||||
* Function GetRootSheet
|
||||
*
|
||||
|
@ -610,7 +624,12 @@ public:
|
|||
*
|
||||
* @return a SCH_SHEET pointer to the root sheet.
|
||||
*/
|
||||
SCH_SHEET* GetRootSheet();
|
||||
const SCH_SHEET* GetRootSheet() const;
|
||||
|
||||
SCH_SHEET* GetRootSheet()
|
||||
{
|
||||
return const_cast< SCH_SHEET* >( static_cast< const SCH_SHEET&>( *this ).GetRootSheet() );
|
||||
}
|
||||
|
||||
/**
|
||||
* Function IsRootSheet
|
||||
|
@ -747,6 +766,20 @@ public:
|
|||
*/
|
||||
SCH_ITEM* FindNextItem( KICAD_T aType, SCH_ITEM* aLastItem = NULL, bool aWrap = false ) const;
|
||||
|
||||
/**
|
||||
* Function TestForRecursion
|
||||
*
|
||||
* test every SCH_SHEET in the SCH_SHEET hierarchy to verify if adding the sheets stored
|
||||
* in \a aSrcSheetHierarchy to the sheet stored in \a aDestFileName will cause recursion.
|
||||
*
|
||||
* @param aSrcSheetHierarchy is a list #SCH_SHEET pointer lists of the source sheet add
|
||||
* to \a aDestFileName.
|
||||
* @param aDestFileName is the file name of the destination sheet for \a aSrcFileName.
|
||||
* @return true if \a aFileName will cause recursion in the sheet path. Otherwise false.
|
||||
*/
|
||||
bool TestForRecursion( std::vector< std::vector< const SCH_SHEET* > >& aSrcSheetHierarchy,
|
||||
const wxString& aDestFileName ) const;
|
||||
|
||||
#if defined(DEBUG)
|
||||
void Show( int nestLevel, std::ostream& os ) const; // override
|
||||
#endif
|
||||
|
|
|
@ -294,69 +294,6 @@ bool SCH_SHEET_PATH::operator==( const SCH_SHEET_PATH& d1 ) const
|
|||
}
|
||||
|
||||
|
||||
bool SCH_SHEET_PATH::TestForRecursion( const wxString& aSrcFileName,
|
||||
const wxString& aDestFileName ) const
|
||||
{
|
||||
wxFileName rootFn = g_RootSheet->GetFileName();
|
||||
wxFileName srcFn = aSrcFileName;
|
||||
wxFileName destFn = aDestFileName;
|
||||
|
||||
if( srcFn.IsRelative() )
|
||||
srcFn.MakeAbsolute( rootFn.GetPath() );
|
||||
|
||||
if( destFn.IsRelative() )
|
||||
destFn.MakeAbsolute( rootFn.GetPath() );
|
||||
|
||||
|
||||
// The source and destination sheet file names cannot be the same.
|
||||
if( srcFn == destFn )
|
||||
return true;
|
||||
|
||||
/// @todo Store sheet file names with full path, either relative to project path
|
||||
/// or absolute path. The current design always assumes subsheet files are
|
||||
/// located in the project folder which may or may not be desirable.
|
||||
unsigned i = 0;
|
||||
|
||||
while( i < m_numSheets )
|
||||
{
|
||||
wxFileName cmpFn = m_sheets[i]->GetFileName();
|
||||
|
||||
if( cmpFn.IsRelative() )
|
||||
cmpFn.MakeAbsolute( rootFn.GetPath() );
|
||||
|
||||
// Test if the file name of the destination sheet is in anywhere in this sheet path.
|
||||
if( cmpFn == destFn )
|
||||
break;
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
// The destination sheet file name was not found in the sheet path or the destination
|
||||
// sheet file name is the root sheet so no recursion is possible.
|
||||
if( i >= m_numSheets || i == 0 )
|
||||
return false;
|
||||
|
||||
// Walk back up to the root sheet to see if the source file name is already a parent in
|
||||
// the sheet path. If so, recursion will occur.
|
||||
do
|
||||
{
|
||||
i -= 1;
|
||||
|
||||
wxFileName cmpFn = m_sheets[i]->GetFileName();
|
||||
|
||||
if( cmpFn.IsRelative() )
|
||||
cmpFn.MakeAbsolute( rootFn.GetPath() );
|
||||
|
||||
if( cmpFn == srcFn )
|
||||
return true;
|
||||
|
||||
} while( i != 0 );
|
||||
|
||||
// The source sheet file name is not a parent of the destination sheet file name.
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
int SCH_SHEET_PATH::FindSheet( const wxString& aFileName ) const
|
||||
{
|
||||
for( unsigned i = 0; i < m_numSheets; i++ )
|
||||
|
@ -600,37 +537,6 @@ SCH_ITEM* SCH_SHEET_LIST::FindPreviousItem( KICAD_T aType, SCH_SHEET_PATH** aShe
|
|||
}
|
||||
|
||||
|
||||
bool SCH_SHEET_LIST::TestForRecursion( const SCH_SHEET_LIST& aSrcSheetHierarchy,
|
||||
const wxString& aDestFileName ) const
|
||||
{
|
||||
wxFileName rootFn = g_RootSheet->GetFileName();
|
||||
wxFileName destFn = aDestFileName;
|
||||
|
||||
if( destFn.IsRelative() )
|
||||
destFn.MakeAbsolute( rootFn.GetPath() );
|
||||
|
||||
// Test each SCH_SHEET_PATH in this SCH_SHEET_LIST for potential recursion.
|
||||
for( int i = 0; i < m_count; i++ )
|
||||
{
|
||||
// Test each SCH_SHEET_PATH in the source sheet.
|
||||
for( int j = 0; j < aSrcSheetHierarchy.GetCount(); j++ )
|
||||
{
|
||||
SCH_SHEET_PATH* sheetPath = aSrcSheetHierarchy.GetSheet( j );
|
||||
|
||||
for( unsigned k = 0; k < sheetPath->GetCount(); k++ )
|
||||
{
|
||||
if( m_list[i].TestForRecursion( sheetPath->GetSheet( k )->GetFileName(),
|
||||
aDestFileName ) )
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// The source sheet file can safely be added to the destination sheet file.
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
SCH_SHEET* SCH_SHEET_LIST::FindSheetByName( const wxString& aSheetName )
|
||||
{
|
||||
for( int i = 0; i < m_count; i++ )
|
||||
|
|
|
@ -220,19 +220,6 @@ public:
|
|||
*/
|
||||
SCH_ITEM* FindPreviousItem( KICAD_T aType, SCH_ITEM* aLastItem = NULL, bool aWrap = false ) const;
|
||||
|
||||
/**
|
||||
* Function TestForRecursion
|
||||
*
|
||||
* test the SCH_SHEET_PATH file names to check adding the sheet stored in the file
|
||||
* \a aSrcFileName to the sheet stored in file \a aDestFileName will cause a sheet
|
||||
* path recursion.
|
||||
*
|
||||
* @param aSrcFileName is the source file name of the sheet add to \a aDestFileName.
|
||||
* @param aDestFileName is the file name of the destination sheet for \a aSrcFileName.
|
||||
* @return true if \a aFileName will cause recursion in the sheet path. Otherwise false.
|
||||
*/
|
||||
bool TestForRecursion( const wxString& aSrcFileName, const wxString& aDestFileName ) const;
|
||||
|
||||
int FindSheet( const wxString& aFileName ) const;
|
||||
|
||||
/**
|
||||
|
@ -388,19 +375,6 @@ public:
|
|||
SCH_ITEM* FindPreviousItem( KICAD_T aType, SCH_SHEET_PATH** aSheetFound = NULL,
|
||||
SCH_ITEM* aLastItem = NULL, bool aWrap = true );
|
||||
|
||||
/**
|
||||
* Function TestForRecursion
|
||||
*
|
||||
* test every SCH_SHEET_PATH in the SCH_SHEET_LIST to verify if adding the sheets stored
|
||||
* in \a aSrcSheetHierarchy to the sheet stored in \a aDestFileName will cause recursion.
|
||||
*
|
||||
* @param aSrcSheetHierarchy is the SCH_SHEET_LIST of the source sheet add to \a aDestFileName.
|
||||
* @param aDestFileName is the file name of the destination sheet for \a aSrcFileName.
|
||||
* @return true if \a aFileName will cause recursion in the sheet path. Otherwise false.
|
||||
*/
|
||||
bool TestForRecursion( const SCH_SHEET_LIST& aSrcSheetHierarchy,
|
||||
const wxString& aDestFileName ) const;
|
||||
|
||||
/**
|
||||
* Function FindSheetByName
|
||||
*
|
||||
|
|
|
@ -983,7 +983,7 @@ void SCH_EDIT_FRAME::OnEditItem( wxCommandEvent& aEvent )
|
|||
}
|
||||
|
||||
case SCH_SHEET_T:
|
||||
if( EditSheet( (SCH_SHEET*) item, m_CurrentSheet ) )
|
||||
if( EditSheet( (SCH_SHEET*) item, m_CurrentSheet->Last() ) )
|
||||
m_canvas->Refresh();
|
||||
break;
|
||||
|
||||
|
|
|
@ -1274,7 +1274,7 @@ void SCH_EDIT_FRAME::addCurrentItemToList( bool aRedraw )
|
|||
// the m_mouseCaptureCallback function.
|
||||
m_canvas->SetMouseCapture( NULL, NULL );
|
||||
|
||||
if( !EditSheet( (SCH_SHEET*)item, m_CurrentSheet ) )
|
||||
if( !EditSheet( (SCH_SHEET*)item, m_CurrentSheet->Last() ) )
|
||||
{
|
||||
screen->SetCurItem( NULL );
|
||||
delete item;
|
||||
|
|
|
@ -1015,7 +1015,7 @@ public:
|
|||
*
|
||||
* Note: the screen is not refresh. The caller is responsible to do that
|
||||
*/
|
||||
bool EditSheet( SCH_SHEET* aSheet, SCH_SHEET_PATH* aHierarchy );
|
||||
bool EditSheet( SCH_SHEET* aSheet, SCH_SHEET* aHierarchy );
|
||||
|
||||
wxPoint GetLastSheetPinPosition() const { return m_lastSheetPinPosition; }
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@
|
|||
#include <project.h>
|
||||
|
||||
|
||||
bool SCH_EDIT_FRAME::EditSheet( SCH_SHEET* aSheet, SCH_SHEET_PATH* aHierarchy )
|
||||
bool SCH_EDIT_FRAME::EditSheet( SCH_SHEET* aSheet, SCH_SHEET* aHierarchy )
|
||||
{
|
||||
if( aSheet == NULL || aHierarchy == NULL )
|
||||
return false;
|
||||
|
@ -235,15 +235,16 @@ bool SCH_EDIT_FRAME::EditSheet( SCH_SHEET* aSheet, SCH_SHEET_PATH* aHierarchy )
|
|||
(long unsigned) aSheet->GetTimeStamp() ) );
|
||||
|
||||
// Make sure the sheet changes do not cause any recursion.
|
||||
SCH_SHEET_LIST sheetHierarchy( aSheet );
|
||||
std::vector< std::vector< const SCH_SHEET* > > sheetHierarchy;
|
||||
aSheet->GetSheetPaths( sheetHierarchy );
|
||||
|
||||
// Make sure files have fully qualified path and file name.
|
||||
wxFileName destFn = aHierarchy->Last()->GetFileName();
|
||||
wxFileName destFn = aHierarchy->GetFileName();
|
||||
|
||||
if( destFn.IsRelative() )
|
||||
destFn.MakeAbsolute( Prj().GetProjectPath() );
|
||||
|
||||
if( hierarchy.TestForRecursion( sheetHierarchy, destFn.GetFullPath( wxPATH_UNIX ) ) )
|
||||
if( g_RootSheet->TestForRecursion( sheetHierarchy, destFn.GetFullPath( wxPATH_UNIX ) ) )
|
||||
{
|
||||
msg.Printf( _( "The sheet changes cannot be made because the destination sheet already "
|
||||
"has the sheet <%s> or one of it's subsheets as a parent somewhere in "
|
||||
|
@ -357,7 +358,7 @@ SCH_SHEET* SCH_EDIT_FRAME::CreateSheet( wxDC* aDC )
|
|||
|
||||
sheet->SetFlags( IS_NEW | IS_RESIZED );
|
||||
sheet->SetTimeStamp( GetNewTimeStamp() );
|
||||
sheet->SetParent( GetScreen() );
|
||||
sheet->SetParent( GetCurrentSheet().Last() );
|
||||
sheet->SetScreen( NULL );
|
||||
|
||||
// need to check if this is being added to the GetDrawItems().
|
||||
|
|
|
@ -194,7 +194,7 @@ MODULE* GITHUB_PLUGIN::FootprintLoad( const wxString& aLibraryPath,
|
|||
|
||||
if( it != m_gh_cache->end() ) // fp_name is present
|
||||
{
|
||||
wxMemoryInputStream mis( &m_zip_image[0], m_zip_image.size() );
|
||||
wxMemoryInputStream mis( m_zip_image.data(), m_zip_image.size() );
|
||||
|
||||
// This decoder should always be UTF8, since it was saved that way by git.
|
||||
// That is, since pretty footprints are UTF8, and they were pushed to the
|
||||
|
@ -205,21 +205,17 @@ MODULE* GITHUB_PLUGIN::FootprintLoad( const wxString& aLibraryPath,
|
|||
if( zis.OpenEntry( *entry ) )
|
||||
{
|
||||
INPUTSTREAM_LINE_READER reader( &zis, aLibraryPath );
|
||||
#if 1
|
||||
|
||||
// I am a PCB_IO derivative with my own PCB_PARSER
|
||||
m_parser->SetLineReader( &reader ); // ownership not passed
|
||||
|
||||
MODULE* ret = (MODULE*) m_parser->Parse();
|
||||
#else
|
||||
PCB_PARSER parser( &reader );
|
||||
|
||||
MODULE* ret = (MODULE*) parser.Parse();
|
||||
#endif
|
||||
|
||||
// Dude, the footprint name comes from the file name in
|
||||
// a github library. Zero out the library name, we don't know it here.
|
||||
// Some caller may set the library nickname, one such instance is
|
||||
// FP_LIB_TABLE::FootprintLoad().
|
||||
// In a github library, (as well as in a "KiCad" library) the name of
|
||||
// the pretty file defines the footprint name. That filename trumps
|
||||
// any name found in the pretty file; any name in the pretty file
|
||||
// must be ignored here. Also, the library nickname is unknown in
|
||||
// this context so clear it just in case.
|
||||
ret->SetFPID( fp_name );
|
||||
|
||||
return ret;
|
||||
|
@ -541,11 +537,14 @@ void GITHUB_PLUGIN::remoteGetZip( const wxString& aRepoURL ) throw( IO_ERROR )
|
|||
}
|
||||
catch( const IO_ERROR& ioe )
|
||||
{
|
||||
// https "GET" has faild, report this to API caller.
|
||||
// https "GET" has failed, report this to API caller.
|
||||
// Note: kcurl.Perform() does not return an error if the file to download is not found
|
||||
static const char errorcmd[] = "http GET command failed"; // Do not translate this message
|
||||
|
||||
UTF8 fmt( _( "%s\nCannot get/download Zip archive: '%s'\nfor library path: '%s'.\nReason: '%s'" ) );
|
||||
|
||||
std::string msg = StrPrintf( fmt.c_str(),
|
||||
errorcmd,
|
||||
zip_url.c_str(),
|
||||
TO_UTF8( aRepoURL ),
|
||||
TO_UTF8( ioe.errorText )
|
||||
|
|
|
@ -2694,11 +2694,13 @@ ZONE_CONTAINER* PCB_PARSER::parseZONE_CONTAINER() throw( IO_ERROR, PARSE_ERROR )
|
|||
break;
|
||||
|
||||
case T_chamfer:
|
||||
zone->SetCornerSmoothingType( ZONE_SETTINGS::SMOOTHING_CHAMFER );
|
||||
if( !zone->GetIsKeepout() ) // smoothing has meaning only for filled zones
|
||||
zone->SetCornerSmoothingType( ZONE_SETTINGS::SMOOTHING_CHAMFER );
|
||||
break;
|
||||
|
||||
case T_fillet:
|
||||
zone->SetCornerSmoothingType( ZONE_SETTINGS::SMOOTHING_FILLET );
|
||||
if( !zone->GetIsKeepout() ) // smoothing has meaning only for filled zones
|
||||
zone->SetCornerSmoothingType( ZONE_SETTINGS::SMOOTHING_FILLET );
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -2708,7 +2710,9 @@ ZONE_CONTAINER* PCB_PARSER::parseZONE_CONTAINER() throw( IO_ERROR, PARSE_ERROR )
|
|||
break;
|
||||
|
||||
case T_radius:
|
||||
zone->SetCornerRadius( parseBoardUnits( "corner radius" ) );
|
||||
tmp = parseBoardUnits( "corner radius" );
|
||||
if( !zone->GetIsKeepout() ) // smoothing has meaning only for filled zones
|
||||
zone->SetCornerRadius( tmp );
|
||||
NeedRIGHT();
|
||||
break;
|
||||
|
||||
|
|
|
@ -427,6 +427,10 @@ void RN_NET::Update()
|
|||
|
||||
void RN_NET::AddItem( const D_PAD* aPad )
|
||||
{
|
||||
// Ratsnest is not computed for non-copper pads
|
||||
if( ( aPad->GetLayerSet() & LSET::AllCuMask() ).none() )
|
||||
return;
|
||||
|
||||
RN_NODE_PTR node = m_links.AddNode( aPad->GetPosition().x, aPad->GetPosition().y );
|
||||
node->AddParent( aPad );
|
||||
m_pads[aPad].m_Node = node;
|
||||
|
@ -672,51 +676,53 @@ std::list<RN_NODE_PTR> RN_NET::GetNodes( const BOARD_CONNECTED_ITEM* aItem ) con
|
|||
{
|
||||
std::list<RN_NODE_PTR> nodes;
|
||||
|
||||
try
|
||||
switch( aItem->Type() )
|
||||
{
|
||||
switch( aItem->Type() )
|
||||
case PCB_PAD_T:
|
||||
{
|
||||
PAD_NODE_MAP::const_iterator it = m_pads.find( static_cast<const D_PAD*>( aItem ) );
|
||||
|
||||
if( it != m_pads.end() )
|
||||
nodes.push_back( it->second.m_Node );
|
||||
}
|
||||
break;
|
||||
|
||||
case PCB_VIA_T:
|
||||
{
|
||||
VIA_NODE_MAP::const_iterator it = m_vias.find( static_cast<const VIA*>( aItem ) );
|
||||
|
||||
if( it != m_vias.end() )
|
||||
nodes.push_back( it->second );
|
||||
}
|
||||
break;
|
||||
|
||||
case PCB_TRACE_T:
|
||||
{
|
||||
TRACK_EDGE_MAP::const_iterator it = m_tracks.find( static_cast<const TRACK*>( aItem ) );
|
||||
|
||||
if( it != m_tracks.end() )
|
||||
{
|
||||
case PCB_PAD_T:
|
||||
{
|
||||
const D_PAD* pad = static_cast<const D_PAD*>( aItem );
|
||||
nodes.push_back( m_pads.at( pad ).m_Node );
|
||||
nodes.push_back( it->second->GetSourceNode() );
|
||||
nodes.push_back( it->second->GetTargetNode() );
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case PCB_VIA_T:
|
||||
case PCB_ZONE_AREA_T:
|
||||
{
|
||||
ZONE_DATA_MAP::const_iterator it = m_zones.find( static_cast<const ZONE_CONTAINER*>( aItem ) );
|
||||
|
||||
if( it != m_zones.end() )
|
||||
{
|
||||
const VIA* via = static_cast<const VIA*>( aItem );
|
||||
nodes.push_back( m_vias.at( via ) );
|
||||
}
|
||||
break;
|
||||
|
||||
case PCB_TRACE_T:
|
||||
{
|
||||
const TRACK* track = static_cast<const TRACK*>( aItem );
|
||||
const RN_EDGE_MST_PTR& edge = m_tracks.at( track );
|
||||
|
||||
nodes.push_back( edge->GetSourceNode() );
|
||||
nodes.push_back( edge->GetTargetNode() );
|
||||
}
|
||||
break;
|
||||
|
||||
case PCB_ZONE_AREA_T:
|
||||
{
|
||||
const ZONE_CONTAINER* zone = static_cast<const ZONE_CONTAINER*>( aItem );
|
||||
const std::deque<RN_POLY>& polys = m_zones.at( zone ).m_Polygons;
|
||||
|
||||
const std::deque<RN_POLY>& polys = it->second.m_Polygons;
|
||||
for( std::deque<RN_POLY>::const_iterator it = polys.begin(); it != polys.end(); ++it )
|
||||
nodes.push_back( it->GetNode() );
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch( ... )
|
||||
{
|
||||
// It is fine, just return empty list of nodes
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return nodes;
|
||||
|
|
|
@ -589,9 +589,12 @@ int PCB_EDIT_FRAME::Begin_Zone( wxDC* DC )
|
|||
if( GetToolId() == ID_PCB_KEEPOUT_AREA_BUTT )
|
||||
{
|
||||
zoneInfo.SetIsKeepout( true );
|
||||
// Netcode and netname are irrelevant,
|
||||
// Netcode, netname and some other settings are irrelevant,
|
||||
// so ensure they are cleared
|
||||
zone->SetNetCode( NETINFO_LIST::UNCONNECTED );
|
||||
zoneInfo.SetCornerSmoothingType( ZONE_SETTINGS::SMOOTHING_NONE );
|
||||
zoneInfo.SetCornerRadius( 0 );
|
||||
|
||||
edited = InvokeKeepoutAreaEditor( this, &zoneInfo );
|
||||
}
|
||||
else
|
||||
|
|
|
@ -6,7 +6,7 @@ include_directories(
|
|||
${CMAKE_CURRENT_SOURCE_DIR}/x3d
|
||||
)
|
||||
|
||||
add_definitions( -DDEBUG_VRML1=1 -DDEBUG_VRML2=1 -DDEBUG_X3D=4 )
|
||||
add_definitions( -DDEBUG_VRML1=1 -DDEBUG_VRML2=1 -DDEBUG_X3D=1 )
|
||||
|
||||
add_library( s3d_plugin_vrml MODULE
|
||||
${CMAKE_SOURCE_DIR}/common/richio.cpp
|
||||
|
|
Loading…
Reference in New Issue