Sync with main branch r6538
This commit is contained in:
commit
b7a8661a03
|
@ -648,6 +648,7 @@ WARN_LOGFILE =
|
||||||
|
|
||||||
INPUT = coding-style-policy.md \
|
INPUT = coding-style-policy.md \
|
||||||
stable-release-policy.md \
|
stable-release-policy.md \
|
||||||
|
road-map-r5.md \
|
||||||
road-map.md \
|
road-map.md \
|
||||||
compiling.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 \
|
INPUT = Documentation/development/coding-style-policy.md \
|
||||||
Documentation/development/stable-release-policy.md \
|
Documentation/development/stable-release-policy.md \
|
||||||
|
Documentation/development/road-map-r5.md \
|
||||||
Documentation/development/road-map.md \
|
Documentation/development/road-map.md \
|
||||||
Documentation/development/compiling.md \
|
Documentation/development/compiling.md \
|
||||||
kicad \
|
kicad \
|
||||||
|
|
|
@ -475,10 +475,11 @@ void SCH_EDIT_FRAME::PasteListOfItems( wxDC* DC )
|
||||||
if( srcFn.IsRelative() )
|
if( srcFn.IsRelative() )
|
||||||
srcFn.MakeAbsolute( Prj().GetProjectPath() );
|
srcFn.MakeAbsolute( Prj().GetProjectPath() );
|
||||||
|
|
||||||
SCH_SHEET_LIST sheetHierarchy( sheet );
|
std::vector< std::vector< const SCH_SHEET* > > sheetHierarchy;
|
||||||
|
sheet->GetSheetPaths( sheetHierarchy );
|
||||||
|
|
||||||
if( hierarchy.TestForRecursion( sheetHierarchy,
|
if( g_RootSheet->TestForRecursion( sheetHierarchy,
|
||||||
destFn.GetFullPath( wxPATH_UNIX ) ) )
|
destFn.GetFullPath( wxPATH_UNIX ) ) )
|
||||||
{
|
{
|
||||||
wxString msg;
|
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();
|
EDA_ITEM* parent = GetParent();
|
||||||
SCH_SHEET* rootSheet = this;
|
const SCH_SHEET* rootSheet = const_cast< SCH_SHEET* >( this );
|
||||||
|
|
||||||
while( parent )
|
while( parent )
|
||||||
{
|
{
|
||||||
|
@ -1200,7 +1221,7 @@ SCH_SHEET* SCH_SHEET::GetRootSheet()
|
||||||
parent = parent->GetParent();
|
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)
|
#if defined(DEBUG)
|
||||||
|
|
||||||
void SCH_SHEET::Show( int nestLevel, std::ostream& os ) const
|
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.
|
// than assigned in the order the sheets were parsed and loaded.
|
||||||
int m_number;
|
int m_number;
|
||||||
|
|
||||||
|
SCH_SHEET* getRootSheet();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SCH_SHEET( const wxPoint& pos = wxPoint( 0, 0 ) );
|
SCH_SHEET( const wxPoint& pos = wxPoint( 0, 0 ) );
|
||||||
|
|
||||||
|
@ -599,6 +601,18 @@ public:
|
||||||
*/
|
*/
|
||||||
unsigned GetSheets( std::vector<const SCH_SHEET*>& aSheetList ) const;
|
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
|
* Function GetRootSheet
|
||||||
*
|
*
|
||||||
|
@ -610,7 +624,12 @@ public:
|
||||||
*
|
*
|
||||||
* @return a SCH_SHEET pointer to the root sheet.
|
* @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
|
* Function IsRootSheet
|
||||||
|
@ -747,6 +766,20 @@ public:
|
||||||
*/
|
*/
|
||||||
SCH_ITEM* FindNextItem( KICAD_T aType, SCH_ITEM* aLastItem = NULL, bool aWrap = false ) const;
|
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)
|
#if defined(DEBUG)
|
||||||
void Show( int nestLevel, std::ostream& os ) const; // override
|
void Show( int nestLevel, std::ostream& os ) const; // override
|
||||||
#endif
|
#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
|
int SCH_SHEET_PATH::FindSheet( const wxString& aFileName ) const
|
||||||
{
|
{
|
||||||
for( unsigned i = 0; i < m_numSheets; i++ )
|
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 )
|
SCH_SHEET* SCH_SHEET_LIST::FindSheetByName( const wxString& aSheetName )
|
||||||
{
|
{
|
||||||
for( int i = 0; i < m_count; i++ )
|
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;
|
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;
|
int FindSheet( const wxString& aFileName ) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -388,19 +375,6 @@ public:
|
||||||
SCH_ITEM* FindPreviousItem( KICAD_T aType, SCH_SHEET_PATH** aSheetFound = NULL,
|
SCH_ITEM* FindPreviousItem( KICAD_T aType, SCH_SHEET_PATH** aSheetFound = NULL,
|
||||||
SCH_ITEM* aLastItem = NULL, bool aWrap = true );
|
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
|
* Function FindSheetByName
|
||||||
*
|
*
|
||||||
|
|
|
@ -983,7 +983,7 @@ void SCH_EDIT_FRAME::OnEditItem( wxCommandEvent& aEvent )
|
||||||
}
|
}
|
||||||
|
|
||||||
case SCH_SHEET_T:
|
case SCH_SHEET_T:
|
||||||
if( EditSheet( (SCH_SHEET*) item, m_CurrentSheet ) )
|
if( EditSheet( (SCH_SHEET*) item, m_CurrentSheet->Last() ) )
|
||||||
m_canvas->Refresh();
|
m_canvas->Refresh();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -1274,7 +1274,7 @@ void SCH_EDIT_FRAME::addCurrentItemToList( bool aRedraw )
|
||||||
// the m_mouseCaptureCallback function.
|
// the m_mouseCaptureCallback function.
|
||||||
m_canvas->SetMouseCapture( NULL, NULL );
|
m_canvas->SetMouseCapture( NULL, NULL );
|
||||||
|
|
||||||
if( !EditSheet( (SCH_SHEET*)item, m_CurrentSheet ) )
|
if( !EditSheet( (SCH_SHEET*)item, m_CurrentSheet->Last() ) )
|
||||||
{
|
{
|
||||||
screen->SetCurItem( NULL );
|
screen->SetCurItem( NULL );
|
||||||
delete item;
|
delete item;
|
||||||
|
|
|
@ -1015,7 +1015,7 @@ public:
|
||||||
*
|
*
|
||||||
* Note: the screen is not refresh. The caller is responsible to do that
|
* 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; }
|
wxPoint GetLastSheetPinPosition() const { return m_lastSheetPinPosition; }
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
#include <project.h>
|
#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 )
|
if( aSheet == NULL || aHierarchy == NULL )
|
||||||
return false;
|
return false;
|
||||||
|
@ -235,15 +235,16 @@ bool SCH_EDIT_FRAME::EditSheet( SCH_SHEET* aSheet, SCH_SHEET_PATH* aHierarchy )
|
||||||
(long unsigned) aSheet->GetTimeStamp() ) );
|
(long unsigned) aSheet->GetTimeStamp() ) );
|
||||||
|
|
||||||
// Make sure the sheet changes do not cause any recursion.
|
// 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.
|
// Make sure files have fully qualified path and file name.
|
||||||
wxFileName destFn = aHierarchy->Last()->GetFileName();
|
wxFileName destFn = aHierarchy->GetFileName();
|
||||||
|
|
||||||
if( destFn.IsRelative() )
|
if( destFn.IsRelative() )
|
||||||
destFn.MakeAbsolute( Prj().GetProjectPath() );
|
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 "
|
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 "
|
"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->SetFlags( IS_NEW | IS_RESIZED );
|
||||||
sheet->SetTimeStamp( GetNewTimeStamp() );
|
sheet->SetTimeStamp( GetNewTimeStamp() );
|
||||||
sheet->SetParent( GetScreen() );
|
sheet->SetParent( GetCurrentSheet().Last() );
|
||||||
sheet->SetScreen( NULL );
|
sheet->SetScreen( NULL );
|
||||||
|
|
||||||
// need to check if this is being added to the GetDrawItems().
|
// 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
|
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.
|
// 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
|
// 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 ) )
|
if( zis.OpenEntry( *entry ) )
|
||||||
{
|
{
|
||||||
INPUTSTREAM_LINE_READER reader( &zis, aLibraryPath );
|
INPUTSTREAM_LINE_READER reader( &zis, aLibraryPath );
|
||||||
#if 1
|
|
||||||
// I am a PCB_IO derivative with my own PCB_PARSER
|
// I am a PCB_IO derivative with my own PCB_PARSER
|
||||||
m_parser->SetLineReader( &reader ); // ownership not passed
|
m_parser->SetLineReader( &reader ); // ownership not passed
|
||||||
|
|
||||||
MODULE* ret = (MODULE*) m_parser->Parse();
|
MODULE* ret = (MODULE*) m_parser->Parse();
|
||||||
#else
|
|
||||||
PCB_PARSER parser( &reader );
|
|
||||||
|
|
||||||
MODULE* ret = (MODULE*) parser.Parse();
|
// In a github library, (as well as in a "KiCad" library) the name of
|
||||||
#endif
|
// the pretty file defines the footprint name. That filename trumps
|
||||||
|
// any name found in the pretty file; any name in the pretty file
|
||||||
// Dude, the footprint name comes from the file name in
|
// must be ignored here. Also, the library nickname is unknown in
|
||||||
// a github library. Zero out the library name, we don't know it here.
|
// this context so clear it just in case.
|
||||||
// Some caller may set the library nickname, one such instance is
|
|
||||||
// FP_LIB_TABLE::FootprintLoad().
|
|
||||||
ret->SetFPID( fp_name );
|
ret->SetFPID( fp_name );
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -541,11 +537,14 @@ void GITHUB_PLUGIN::remoteGetZip( const wxString& aRepoURL ) throw( IO_ERROR )
|
||||||
}
|
}
|
||||||
catch( const IO_ERROR& ioe )
|
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
|
// 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'" ) );
|
UTF8 fmt( _( "%s\nCannot get/download Zip archive: '%s'\nfor library path: '%s'.\nReason: '%s'" ) );
|
||||||
|
|
||||||
std::string msg = StrPrintf( fmt.c_str(),
|
std::string msg = StrPrintf( fmt.c_str(),
|
||||||
|
errorcmd,
|
||||||
zip_url.c_str(),
|
zip_url.c_str(),
|
||||||
TO_UTF8( aRepoURL ),
|
TO_UTF8( aRepoURL ),
|
||||||
TO_UTF8( ioe.errorText )
|
TO_UTF8( ioe.errorText )
|
||||||
|
|
|
@ -2694,11 +2694,13 @@ ZONE_CONTAINER* PCB_PARSER::parseZONE_CONTAINER() throw( IO_ERROR, PARSE_ERROR )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_chamfer:
|
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;
|
break;
|
||||||
|
|
||||||
case T_fillet:
|
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;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -2708,7 +2710,9 @@ ZONE_CONTAINER* PCB_PARSER::parseZONE_CONTAINER() throw( IO_ERROR, PARSE_ERROR )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_radius:
|
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();
|
NeedRIGHT();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -427,6 +427,10 @@ void RN_NET::Update()
|
||||||
|
|
||||||
void RN_NET::AddItem( const D_PAD* aPad )
|
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 );
|
RN_NODE_PTR node = m_links.AddNode( aPad->GetPosition().x, aPad->GetPosition().y );
|
||||||
node->AddParent( aPad );
|
node->AddParent( aPad );
|
||||||
m_pads[aPad].m_Node = node;
|
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;
|
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:
|
nodes.push_back( it->second->GetSourceNode() );
|
||||||
{
|
nodes.push_back( it->second->GetTargetNode() );
|
||||||
const D_PAD* pad = static_cast<const D_PAD*>( aItem );
|
|
||||||
nodes.push_back( m_pads.at( pad ).m_Node );
|
|
||||||
}
|
}
|
||||||
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 );
|
const std::deque<RN_POLY>& polys = it->second.m_Polygons;
|
||||||
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;
|
|
||||||
|
|
||||||
for( std::deque<RN_POLY>::const_iterator it = polys.begin(); it != polys.end(); ++it )
|
for( std::deque<RN_POLY>::const_iterator it = polys.begin(); it != polys.end(); ++it )
|
||||||
nodes.push_back( it->GetNode() );
|
nodes.push_back( it->GetNode() );
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
catch( ... )
|
break;
|
||||||
{
|
|
||||||
// It is fine, just return empty list of nodes
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return nodes;
|
return nodes;
|
||||||
|
|
|
@ -589,9 +589,12 @@ int PCB_EDIT_FRAME::Begin_Zone( wxDC* DC )
|
||||||
if( GetToolId() == ID_PCB_KEEPOUT_AREA_BUTT )
|
if( GetToolId() == ID_PCB_KEEPOUT_AREA_BUTT )
|
||||||
{
|
{
|
||||||
zoneInfo.SetIsKeepout( true );
|
zoneInfo.SetIsKeepout( true );
|
||||||
// Netcode and netname are irrelevant,
|
// Netcode, netname and some other settings are irrelevant,
|
||||||
// so ensure they are cleared
|
// so ensure they are cleared
|
||||||
zone->SetNetCode( NETINFO_LIST::UNCONNECTED );
|
zone->SetNetCode( NETINFO_LIST::UNCONNECTED );
|
||||||
|
zoneInfo.SetCornerSmoothingType( ZONE_SETTINGS::SMOOTHING_NONE );
|
||||||
|
zoneInfo.SetCornerRadius( 0 );
|
||||||
|
|
||||||
edited = InvokeKeepoutAreaEditor( this, &zoneInfo );
|
edited = InvokeKeepoutAreaEditor( this, &zoneInfo );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -6,7 +6,7 @@ include_directories(
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/x3d
|
${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
|
add_library( s3d_plugin_vrml MODULE
|
||||||
${CMAKE_SOURCE_DIR}/common/richio.cpp
|
${CMAKE_SOURCE_DIR}/common/richio.cpp
|
||||||
|
|
Loading…
Reference in New Issue