← Back to team overview

kicad-developers team mailing list archive

Re: [PATCH] Move ZoomFitScreen and ZoomPreset to common

 

The caching was only used by the auto router before. Orson's patch
implements local caching in the auto router, and other sites just
regenerate the bbox when they need to retrieve it, which is the same
behavior as before.

We can't add a caching system that didn't exist before without the board
dirty flag that I mentioned would be a ton of work to implement.

-Jon

On Mar 1, 2017 16:25, "Wayne Stambaugh" <stambaughw@xxxxxxxxx> wrote:

I thought we were retaining the cached behavior for existing code and
implementing a secondary feature to always recalculate the bounding box.
 It looks to me as though the cached behavior has completely been
removed unless I'm missing something.

On 3/1/2017 9:07 AM, Jon Evans wrote:
> It was in this thread; I've attached them both again for convenience.
> The "0001-Remove-BOARD-SetBoundingBox.patch" is applied after applying
> the other patch.
>
> On Wed, Mar 1, 2017 at 8:59 AM, Wayne Stambaugh <stambaughw@xxxxxxxxx
> <mailto:stambaughw@xxxxxxxxx>> wrote:
>
>     On 3/1/2017 8:54 AM, Jon Evans wrote:
>     > Wayne, Orson's latest patch is basically Option 2 but implemented
>     > another way.  Can you check it out and let us know if you are OK
merging
>     > it as-is, or if we should change the implementation to be more like
what
>     > I described?
>
>     I don't remember seeing this patch.  Was it posted to the dev list?
>
>     >
>     > Thanks,
>     > Jon
>     >
>     > On Wed, Mar 1, 2017 at 8:43 AM, Wayne Stambaugh <
stambaughw@xxxxxxxxx <mailto:stambaughw@xxxxxxxxx>
>     > <mailto:stambaughw@xxxxxxxxx <mailto:stambaughw@xxxxxxxxx>>> wrote:
>     >
>     >     Option 2 seems fine.  It may be easier to just add an option
>     argument to
>     >     the existing GetBoundingBox() function to either return the
cached
>     >     bounding box or recalculate the bounding box on demand rather
than
>     >     create a different function for the cached vs. uncached version.
>     >
>     >     On 3/1/2017 2:51 AM, Maciej Sumiński wrote:
>     >     > Wayne, what do you think? If it is acceptable, then I would
>     like to
>     >     > merge the patches. I should not judge my code, as I might be
>     >     tempted to
>     >     > consider it a good solution.
>     >     >
>     >     > In case my proposal to cache the bounding box in autorouter
code
>     >     is not
>     >     > approved, then I would say #2 would do the job.
>     >     >
>     >     > Cheers,
>     >     > Orson
>     >     >
>     >     > On 03/01/2017 01:23 AM, Jon Evans wrote:
>     >     >> Update: after some more testing, I think Orson's patch on
>     top of
>     >     mine is
>     >     >> the way to go.  It pulls the computation out of the loops for
>     >     autorouter,
>     >     >> and that's the only place where the board's bounding box is
>     used
>     >     >> repetitively.  Since the other call sites are only going to
>     get the
>     >     >> bounding box intermittently, I don't think it's worth any
>     effort
>     >     doing
>     >     >> complicated things to track and recompute the bounding box
when
>     >     things are
>     >     >> changed.
>     >     >>
>     >     >> So, I think my patch and Orson's should be merged.
>     >     >>
>     >     >> -Jon
>     >     >>
>     >     >> On Tue, Feb 28, 2017 at 6:51 PM, Jon Evans
>     <jon@xxxxxxxxxxxxx <mailto:jon@xxxxxxxxxxxxx>
>     >     <mailto:jon@xxxxxxxxxxxxx <mailto:jon@xxxxxxxxxxxxx>>> wrote:
>     >     >>
>     >     >>> I'm finally back to this problem now that I have some
>     other WIP
>     >     committed.
>     >     >>>
>     >     >>> As far as I can tell, there two paths to go down for this
>     problem:
>     >     >>>
>     >     >>> 1) Implement auto-caching of the bounding box.  This
>     requires some
>     >     >>> mechanism to tell BOARD that it needs to update the cache,
>     be it
>     >     OBSERVABLE
>     >     >>> or some other update function added to BOARD_ITEM.  No
matter
>     >     how it's
>     >     >>> done, this method seems not great to me because it requires
>     >     touching a ton
>     >     >>> of code to provide coverage for every possible entry point
>     that
>     >     could end
>     >     >>> up having an effect on the bounding box.
>     >     >>>
>     >     >>> 2) Have two different calls to get the bounding box for an
>     >     EDA_ITEM, one
>     >     >>> that always re-generates the cache and one that just
returns a
>     >     cached
>     >     >>> value.  Update the call sites that hit the bounding box
>     frequently
>     >     >>> (autorouter, etc) to make use of the cached value; keep
>     the call
>     >     sites that
>     >     >>> always re-generate the bounding box in today's code
>     working that
>     >     way.
>     >     >>> Performance shouldn't be any better or worse than it is now.
>     >     >>>
>     >     >>> 3) Track whether a board is clean/dirty in some other way
>     >     besides looking
>     >     >>> at BOARD_ITEMs.  This might not be practical while we still
>     >     support legacy,
>     >     >>> but once there is only GAL, I could see this maybe being
>     >     possible through
>     >     >>> the tool framework.  For example, actions could be marked as
>     >     possibly
>     >     >>> impacting the board or not (i.e. move item does, zoom does
>     not)
>     >     >>>
>     >     >>> So, unless someone suggests otherwise, I'm going to try
>     >     implementing #2,
>     >     >>> and suggest #3 as a future improvement that would improve
>     >     performance for
>     >     >>> some edge case operations (i.e. "zoom to fit screen" would
be
>     >     instantaneous
>     >     >>> if nothing has modified the board since the last time the
bbox
>     >     was cached,
>     >     >>> even on large boards)
>     >     >>>
>     >     >>> -Jon
>     >     >>>
>     >     >>> On Fri, Feb 24, 2017 at 11:01 AM, Wayne Stambaugh
>     >     <stambaughw@xxxxxxxxx <mailto:stambaughw@xxxxxxxxx>
>     <mailto:stambaughw@xxxxxxxxx <mailto:stambaughw@xxxxxxxxx>>>
>     >     >>> wrote:
>     >     >>>
>     >     >>>> On 2/24/2017 10:30 AM, Maciej Sumiński wrote:
>     >     >>>>> Most of the operations one can do on a BOARD_ITEM
>     potentially
>     >     affects
>     >     >>>>> the board bounding box. It means there might be many
places
>     >     where the
>     >     >>>>> notifications should be added.
>     >     >>>>>
>     >     >>>>> Some time ago, Michael Steinberg has put in place
>     OBSERVABLE class
>     >     >>>>> (include/observable.h) that could facilitate the task.
>     >     >>>>
>     >     >>>> It could be useful but I'm not sure it would be a better
>     design
>     >     than the
>     >     >>>> child object informing it's parent that it's bounding box
has
>     >     changed.
>     >     >>>> I'm not sure the additional code would make the code any
more
>     >     readable.
>     >     >>>> The only benefit would be if other observers were required.
>     >     >>>>
>     >     >>>>>
>     >     >>>>> With the current approach, developers have to guess
>     whether to
>     >     update
>     >     >>>>> the bounding box with ComputeBoundingBox() or take the
>     cached
>     >     value.
>     >     >>>>> Update is called in very few places, so I really wonder
what
>     >     kind of
>     >     >>>>> magic makes it work, but I might have missed something
here.
>     >     >>>>
>     >     >>>> This solution would require limiting the entry points in
>     the BOARD
>     >     >>>> object that allow changes to the BOARD's child items.
>     >     Conceptually this
>     >     >>>> is probably easier to understand but requires developers
>     to be
>     >     diligent
>     >     >>>> when making changes to the BOARD object or not trying to
>     bypass
>     >     these
>     >     >>>> entry points.
>     >     >>>>
>     >     >>>>>
>     >     >>>>> Regards,
>     >     >>>>> Orson
>     >     >>>>>
>     >     >>>>> On 02/24/2017 04:06 PM, Wayne Stambaugh wrote:
>     >     >>>>>> Every BOARD_ITEM has a parent/child relationship or at
>     least
>     >     it did if
>     >     >>>>>> someone did not break it.  You can always find the parent
>     >     BOARD object
>     >     >>>>>> by walking up the BOARD_ITEM parent list.  There is
>     already a
>     >     >>>>>> BOARD_ITEM::GetBoard() call that should return the parent
>     >     board.  You
>     >     >>>>>> could use that to notify the BOARD object when a child
>     BOARD_ITEM
>     >     >>>> change
>     >     >>>>>> effects the bounding box.
>     >     >>>>>>
>     >     >>>>>> On 2/24/2017 9:27 AM, Jon Evans wrote:
>     >     >>>>>>> We need a solution that allows GetBoundingBox to be
called
>     >     blindly,
>     >     >>>>>>> without knowing if (or how) an EDA_ITEM subclass needs
to
>     >     have the
>     >     >>>>>>> bounding box updated.
>     >     >>>>>>>
>     >     >>>>>>> Does anyone have ideas about how complicated it would
>     be to
>     >     give the
>     >     >>>>>>> BOARD class knowledge of whether or not anything
>     inside it has
>     >     >>>> changed?
>     >     >>>>>>> This is what I tried to implement at first, but Orson
>     >     pointed out that
>     >     >>>>>>> the way I did it would miss some kinds of changes.
>     >     >>>>>>>
>     >     >>>>>>> Figuring out the above also seems useful for other
reasons
>     >     -- for
>     >     >>>>>>> example, autosave / backup features are easier to
>     implement
>     >     if there
>     >     >>>> is
>     >     >>>>>>> a global "dirty/clean" flag for things like BOARD.
>     >     >>>>>>>
>     >     >>>>>>> If there is no good way to implement caching, I guess
>     >     another way
>     >     >>>> would
>     >     >>>>>>> be to implement caching at the sites that use the BOARD
>     >     bounding box
>     >     >>>>>>> heavily (autorouter etc)
>     >     >>>>>>>
>     >     >>>>>>> -Jon
>     >     >>>>>>>
>     >     >>>>>>> On Fri, Feb 24, 2017 at 9:22 AM, Wayne Stambaugh <
>     >     >>>> stambaughw@xxxxxxxxx <mailto:stambaughw@xxxxxxxxx>
>     <mailto:stambaughw@xxxxxxxxx <mailto:stambaughw@xxxxxxxxx>>
>     >     >>>>>>> <mailto:stambaughw@xxxxxxxxx
>     <mailto:stambaughw@xxxxxxxxx> <mailto:stambaughw@xxxxxxxxx
>     <mailto:stambaughw@xxxxxxxxx>>>>
>     >     wrote:
>     >     >>>>>>>
>     >     >>>>>>>     On 2/24/2017 4:16 AM, Maciej Sumiński wrote:
>     >     >>>>>>>     > Hi Jon,
>     >     >>>>>>>     >
>     >     >>>>>>>     > The current version looks much better to me.
>     From what
>     >     I see
>     >     >>>> there is no
>     >     >>>>>>>     > actual bounding box caching, as GetBoundingBox()
>     >     always calls
>     >     >>>>>>>     > ComputeBoundingBox(). I am fine with that, but
>     before
>     >     I push
>     >     >>>> the patch I
>     >     >>>>>>>     > need to ask: does anyone know why the board
bounding
>     >     box is
>     >     >>>> cached? I
>     >     >>>>>>>     > believe it must have been done to boost
>     performance of
>     >     certain
>     >     >>>> parts of
>     >     >>>>>>>     > the code, but I wonder if it is really necessary.
>     >     Especially
>     >     >>>> that one
>     >     >>>>>>>     > needs to know that it has to be updated using
>     >     >>>> ComputeBoundingBox().
>     >     >>>>>>>
>     >     >>>>>>>     It was cached so it didn't need to be recalculated
>     every
>     >     time the
>     >     >>>>>>>     bounding box was required.  It should or at least
>     it did
>     >     >>>> recalculate
>     >     >>>>>>>     only when the changes were made since the last call
to
>     >     fetch the
>     >     >>>>>>>     bounding box.  On very complex boards, this can
take a
>     >     while.
>     >     >>>> Getting
>     >     >>>>>>>     the bounding box is called fairly often so this
>     can add
>     >     up.  I
>     >     >>>> don't see
>     >     >>>>>>>     any reason to recalculate the bounding box on
>     every get
>     >     bounding
>     >     >>>> box
>     >     >>>>>>>     call.  If the current bounding box behavior is
broken,
>     >     then it
>     >     >>>> should be
>     >     >>>>>>>     fixed.  I don't see any reason to get rid of the
>     caching
>     >     method.
>     >     >>>> If you
>     >     >>>>>>>     are operating outside of the normal methods for
adding
>     >     and/or
>     >     >>>> editing
>     >     >>>>>>>     board objects that prevents the correct bounding box
>     >     from being
>     >     >>>>>>>     calculated, that is your fault and you need to fix
>     your code
>     >     >>>>>>>     accordingly.
>     >     >>>>>>>
>     >     >>>>>>>     >
>     >     >>>>>>>     > Just by looking at the code, I noticed that the
>     >     autorouter calls
>     >     >>>>>>>     > BOARD::GetBoundingBox() frequently, but I could
not
>     >     see much
>     >     >>>>>>>     difference
>     >     >>>>>>>     > with caching disabled. Likely, the routing
>     algorithm takes
>     >     >>>>>>>     significantly
>     >     >>>>>>>     > more time than the bounding box calculations.
>     >     >>>>>>>     >
>     >     >>>>>>>     > Personally I would completely remove
>     m_BoundingBox field
>     >     >>>> instead of
>     >     >>>>>>>     > making it mutable. Also, I have noticed there are
a
>     >     few places
>     >     >>>>>>>     where the
>     >     >>>>>>>     > bounding box is overridden with SetBoundingBox().
It
>     >     seems to
>     >     >>>> me a bit
>     >     >>>>>>>     > dubious, as bounding box should depend solely on
>     the items
>     >     >>>>>>>     belonging to
>     >     >>>>>>>     > the board. I attach a patch to show what I would
>     >     change. Any
>     >     >>>> comments,
>     >     >>>>>>>     > especially from Wayne & Jean-Pierre?
>     >     >>>>>>>     >
>     >     >>>>>>>     > Regards,
>     >     >>>>>>>     > Orson
>     >     >>>>>>>     >
>     >     >>>>>>>     > On 02/23/2017 01:49 PM, Jon Evans wrote:
>     >     >>>>>>>     >> Hi Orson,
>     >     >>>>>>>     >>
>     >     >>>>>>>     >> Here's an updated patch with the changes you
>     >     requested.  The
>     >     >>>> only
>     >     >>>>>>>     issue is,
>     >     >>>>>>>     >> without some kind of caching, I had to change the
>     >     call sites
>     >     >>>> that
>     >     >>>>>>>     were
>     >     >>>>>>>     >> interested in the board bounding box with edges
>     only,
>     >     so the
>     >     >>>>>>>     patch has
>     >     >>>>>>>     >> grown in scope.  Let me know if this looks
better.
>     >     >>>>>>>     >>
>     >     >>>>>>>     >> Best,
>     >     >>>>>>>     >> Jon
>     >     >>>>>>>     >>
>     >     >>>>>>>     >> On Thu, Feb 23, 2017 at 4:17 AM, Maciej Sumiński
>     >     >>>>>>>     <maciej.suminski@xxxxxxx
>     <mailto:maciej.suminski@xxxxxxx>
>     >     <mailto:maciej.suminski@xxxxxxx
>     <mailto:maciej.suminski@xxxxxxx>> <mailto:maciej.suminski@xxxxxxx
>     <mailto:maciej.suminski@xxxxxxx>
>     >     <mailto:maciej.suminski@xxxxxxx
>     <mailto:maciej.suminski@xxxxxxx>>>>
>     >     >>>>>>>     >> wrote:
>     >     >>>>>>>     >>
>     >     >>>>>>>     >>> Hi Jon,
>     >     >>>>>>>     >>>
>     >     >>>>>>>     >>> I really like the generic approach in the zoom
>     >     methods. This
>     >     >>>> part I
>     >     >>>>>>>     >>> would merge instantly, but there is an issue
with
>     >     caching the
>     >     >>>> board
>     >     >>>>>>>     >>> bounding box. It does not take into account that
>     >     items already
>     >     >>>>>>>     added to
>     >     >>>>>>>     >>> board may change their position and affect the
>     >     bounding box.
>     >     >>>> I would
>     >     >>>>>>>     >>> remove caching completely, what do you think?
>     >     >>>>>>>     >>>
>     >     >>>>>>>     >>> If you are going to modify the patch, would
>     you rename
>     >     >>>> boardBBox in
>     >     >>>>>>>     >>> COMMON_TOOLS::ZoomFitScreen() to bbox or
anything
>     >     that is not
>     >     >>>>>>>     related to
>     >     >>>>>>>     >>> board? Thank you in advance.
>     >     >>>>>>>     >>>
>     >     >>>>>>>     >>> Regards,
>     >     >>>>>>>     >>> Orson
>     >     >>>>>>>     >>>
>     >     >>>>>>>     >>> On 02/23/2017 05:34 AM, Jon Evans wrote:
>     >     >>>>>>>     >>>> Hi all,
>     >     >>>>>>>     >>>>
>     >     >>>>>>>     >>>> This patch finishes off the refactor I did a
few
>     >     days ago, by
>     >     >>>>>>>     enabling
>     >     >>>>>>>     >>>> ZoomFitScreen to work without knowledge of the
>     >     BOARD class.
>     >     >>>>>>>     >>>>
>     >     >>>>>>>     >>>> In order to make this work, I changed the way
>     >     GetBoundingBox
>     >     >>>> and
>     >     >>>>>>>     >>>> ComputeBoundingBox work so that the call sites
of
>     >     >>>>>>>     GetBoundingBox don't
>     >     >>>>>>>     >>> have
>     >     >>>>>>>     >>>> to also call ComputeBoundingBox if they don't
>     need
>     >     to use the
>     >     >>>>>>>     >>>> aBoardEdgesOnly flag.
>     >     >>>>>>>     >>>>
>     >     >>>>>>>     >>>> Those with good knowledge of BOARD should
review
>     >     this to make
>     >     >>>>>>>     sure I
>     >     >>>>>>>     >>> caught
>     >     >>>>>>>     >>>> all the instances where we should mark the
>     bounding
>     >     box as
>     >     >>>>>>>     needing to be
>     >     >>>>>>>     >>>> re-computed.
>     >     >>>>>>>     >>>>
>     >     >>>>>>>     >>>> Best,
>     >     >>>>>>>     >>>> Jon
>     >     >>>>>>>     >>>>
>     >     >>>>>>>     >>>>
>     >     >>>>>>>     >>>>
>     >     >>>>>>>     >>>> _______________________________________________
>     >     >>>>>>>     >>>> Mailing list:
>     >     https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>
>     >     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>
>     >     >>>>>>>     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>
>     >     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>>
>     >     >>>>>>>     >>>> Post to     :
>     kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>
>     >     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>>
>     >     >>>>>>>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>
>     >     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>>>
>     >     >>>>>>>     >>>> Unsubscribe :
>     >     https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>
>     >     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>
>     >     >>>>>>>     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>
>     >     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>>
>     >     >>>>>>>     >>>> More help   : https://help.launchpad.net/
ListHelp
>     <https://help.launchpad.net/ListHelp>
>     >     <https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>>
>     >     >>>>>>>     <https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>
>     >     <https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>>>
>     >     >>>>>>>     >>>>
>     >     >>>>>>>     >>>
>     >     >>>>>>>     >>>
>     >     >>>>>>>     >>>
>     >     >>>>>>>     >>> _______________________________________________
>     >     >>>>>>>     >>> Mailing list:
>     >     https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>
>     >     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>
>     >     >>>>>>>     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>
>     >     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>>
>     >     >>>>>>>     >>> Post to     : kicad-developers@lists.
launchpad.net
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>
>     >     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>>
>     >     >>>>>>>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>
>     >     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>>>
>     >     >>>>>>>     >>> Unsubscribe :
>     >     https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>
>     >     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>
>     >     >>>>>>>     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>
>     >     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>>
>     >     >>>>>>>     >>> More help   : https://help.launchpad.net/
ListHelp
>     <https://help.launchpad.net/ListHelp>
>     >     <https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>>
>     >     >>>>>>>     <https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>
>     >     <https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>>>
>     >     >>>>>>>     >>>
>     >     >>>>>>>     >>>
>     >     >>>>>>>     >>
>     >     >>>>>>>     >
>     >     >>>>>>>     >
>     >     >>>>>>>     >
>     >     >>>>>>>     > _______________________________________________
>     >     >>>>>>>     > Mailing list: https://launchpad.net/~kicad-
developers
>     <https://launchpad.net/~kicad-developers>
>     >     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>
>     >     >>>>>>>     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>
>     >     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>>
>     >     >>>>>>>     > Post to     : kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>
>     >     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>>
>     >     >>>>>>>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>
>     >     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>>>
>     >     >>>>>>>     > Unsubscribe : https://launchpad.net/~kicad-
developers
>     <https://launchpad.net/~kicad-developers>
>     >     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>
>     >     >>>>>>>     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>
>     >     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>>
>     >     >>>>>>>     > More help   : https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>
>     >     <https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>>
>     >     >>>>>>>     <https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>
>     >     <https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>>>
>     >     >>>>>>>     >
>     >     >>>>>>>
>     >     >>>>>>>
>     >     >>>>>>>     _______________________________________________
>     >     >>>>>>>     Mailing list: https://launchpad.net/~kicad-
developers
>     <https://launchpad.net/~kicad-developers>
>     >     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>
>     >     >>>>>>>     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>
>     >     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>>
>     >     >>>>>>>     Post to     : kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>
>     >     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>>
>     >     >>>>>>>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>
>     >     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>>>
>     >     >>>>>>>     Unsubscribe :
>     https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>
>     >     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>
>     >     >>>>>>>     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>
>     >     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>>
>     >     >>>>>>>     More help   : https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>
>     >     <https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>>
>     >     >>>>>>>     <https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>
>     >     <https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>>>
>     >     >>>>>>>
>     >     >>>>>>>
>     >     >>>>>>
>     >     >>>>>>
>     >     >>>>>> _______________________________________________
>     >     >>>>>> Mailing list: https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>
>     >     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>
>     >     >>>>>> Post to     : kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>
>     >     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>>
>     >     >>>>>> Unsubscribe : https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>
>     >     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>
>     >     >>>>>> More help   : https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>
>     >     <https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>>
>     >     >>>>>>
>     >     >>>>>
>     >     >>>>>
>     >     >>>>>
>     >     >>>>>
>     >     >>>>> _______________________________________________
>     >     >>>>> Mailing list: https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>
>     >     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>
>     >     >>>>> Post to     : kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>
>     >     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>>
>     >     >>>>> Unsubscribe : https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>
>     >     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>
>     >     >>>>> More help   : https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>
>     >     <https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>>
>     >     >>>>>
>     >     >>>>
>     >     >>>>
>     >     >>>> _______________________________________________
>     >     >>>> Mailing list: https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>
>     >     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>
>     >     >>>> Post to     : kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>
>     >     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>>
>     >     >>>> Unsubscribe : https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>
>     >     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>
>     >     >>>> More help   : https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>
>     >     <https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>>
>     >     >>>>
>     >     >>>
>     >     >>>
>     >     >>
>     >     >>
>     >     >>
>     >     >> _______________________________________________
>     >     >> Mailing list: https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>
>     >     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>
>     >     >> Post to     : kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>
>     >     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>>
>     >     >> Unsubscribe : https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>
>     >     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>
>     >     >> More help   : https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>
>     >     <https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>>
>     >     >>
>     >     >
>     >     >
>     >     >
>     >     >
>     >     > _______________________________________________
>     >     > Mailing list: https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>
>     >     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>
>     >     > Post to     : kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>
>     >     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>>
>     >     > Unsubscribe : https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>
>     >     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>
>     >     > More help   : https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>
>     >     <https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>>
>     >     >
>     >
>     >     _______________________________________________
>     >     Mailing list: https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>
>     >     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>
>     >     Post to     : kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>
>     >     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>>
>     >     Unsubscribe : https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>
>     >     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>
>     >     More help   : https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>
>     >     <https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>>
>     >
>     >
>
>

Follow ups

References