It would be preferable to make it possible to call GetSelectMenuText (or really, any facility that needs access to the current units and coordinate transform) without a frame.
We have recently been putting a lot of effort into separating the logic code from the UI / frame code in KiCad, and it would be a shame to introduce something that ties them together. What about bundling together the units selection and the origin transforms into a single object that can be passed into GetSelectMenuText instead of the EDA_DRAW_FRAME? That would make it easier to write testcases and other standalone chunks of code that can pass in arbitrary units and transforms without having to construct a frame. -Jon On Fri, Jul 10, 2020 at 3:33 PM Reece R. Pollack <re...@his.com> wrote: > > The units selection and the origin transforms are both available through > the EDA_DRAW_FRAME. I haven't looked at every call in detail (there are > a combined 118 calls and function declarations), but it appears that > when the caller has access to an EDA_DRAW_FRAME then the call is some > variant of: > > GetSelectMenuText( m_editFrame->GetUserUnits() ); > > Where there isn't access to an EDA_DRAW_FRAME, it's coded as: > > GetSelectMenuText( EDA_UNITS::MILLIMETRES ); > > It seems to me that if we're going to change the parameters to this > function, we should pass a pointer to an EDA_DRAW_FRAME as a single > parameter. If this parameter is nullptr, then we assume > EDA_UNITS::MILLIMETRES and null transforms, otherwise we use the getter > functions in EDA_DRAW_FRAME to get the correct object or data. > > I'd need to see more than a few nodding heads before I made either of > these changes. > > -Reece > > On 7/10/20 3:00 PM, Jeff Young wrote: > > I agree on both points: units and transform should be saved in the project > > file, and they should be passed to GetSelectMenuText as parameters. > > > > Cheers, > > Jeff. > > > > > >> On 10 Jul 2020, at 19:35, Jon Evans <j...@craftyjon.com> wrote: > >> > >> OK, I see. > >> > >> I have mostly stayed out of this conversation before so I will > >> probably step back, but I would suggest that I think that display > >> units and origin choice should be a project-level setting, not > >> system-level. > >> > >> Probably it makes sense to change GetSelectMenuText so that it has > >> this context available somehow (whether by passing in an > >> EDA_DRAW_FRAME or by just passing in the ORIGIN_TRANSFORMS or > >> whatever) > >> > >> -Jon > >> > >> On Fri, Jul 10, 2020 at 2:29 PM Reece R. Pollack <re...@his.com> wrote: > >>> Jon, > >>> > >>> The alternate origins themselves (Place & Drill / Aux origin, and Grid > >>> origin) in Pcbnew are stored in the BOARD_DESIGN_SETTINGS class and > >>> saved in the board file. Of course, the Page origin location doesn't > >>> need to be stored; it's always (0,0). > >>> > >>> My initial thought last year was to store the user's choice of display > >>> origin in the board file, but after some discussion we reached consensus > >>> that the choice of display origin was more like millimeters/inches and > >>> thus should be a user option rather than a board property. In the > >>> proposed implementation, the user's preference for which origin is used > >>> for display is stored in the PCB_DISPLAY_OPTIONS class and saved in the > >>> pcbnew.json file. I think a case could be made that this should be saved > >>> per-project, but no one has made a good argument for that. > >>> > >>> > >>> The primary user of the display origin transforms is the UNIT_BINDER > >>> class. This class has a pointer to the EDA_DRAW_FRAME object. Since > >>> UNIT_BINDER is common, I added a virtual function > >>> "GetOriginTransforms()" to the EDA_DRAW_FRAME class. This function > >>> returns a reference to an ORIGIN_TRANSFORMS class. The base > >>> implementation of the ORIGIN_TRANSFORMS class contains functions that > >>> return their coordinate arguments unchanged. This way none of the KiCad > >>> applications see a change in behavior unless they override the > >>> GetOriginTransforms() function. > >>> > >>> In the case of Pcbnew, the EDA_DRAW_FRAME parameter is actually a > >>> pointer to a PCB_BASE_FRAME object. In this class, the > >>> GetOriginTransforms() function is overridden and returns a reference to > >>> a PCB_ORIGIN_TRANSFORMS object. This object's functions know how to > >>> access the BOARD_DESIGN_SETTINGS and PCB_DISPLAY_OPTIONS objects through > >>> the PCB_BASE_FRAME object and perform the needed transformations. > >>> > >>> This works for everything that can find the EDA_DRAW_FRAME object, like > >>> UNIT_BINDER. The GetMsgPanelInfo functions take an EDA_DRAW_FRAME > >>> pointer as a parameter, so this isn't a problem. However, the > >>> GetSelectMenuText() functions take only an EDA_UNITS parameter. Thus my > >>> problem. > >>> > >>> -Reece > >>> > >>> On 7/10/20 1:25 PM, Jon Evans wrote: > >>>> Shouldn't the origin be stored in the design data (BOARD / SCHEMATIC) > >>>> rather than the base frame? > >>>> > >>>> It seems like all data about objects, including their coordinates in > >>>> the coordinate space defined by the user, should be available just by > >>>> parsing a board or schematic file (which should be independent of the > >>>> EDA_BASE_FRAME) > >>>> > >>>> -Jon > >>>> > >>>> On Fri, Jul 10, 2020 at 1:18 PM Reece R. Pollack <re...@his.com> wrote: > >>>>> Jeff, > >>>>> > >>>>> Thanks for the follow-up. > >>>>> > >>>>> I'm finding some of the GetSelectMenuText() implementations format > >>>>> coordinate addresses for display. That means they need to use display > >>>>> origin transforms so the displayed coordinate matches what the user sees > >>>>> on the status line and elsewhere. However, there does not appear to be a > >>>>> path from these functions to the EDA_BASE_FRAME class where these > >>>>> transforms are currently available. > >>>>> > >>>>> Might someone more familiar with the data structures and calling > >>>>> sequences could suggest how this can best be accomplished? > >>>>> > >>>>> Seth, I'd appreciate it if you could bring your knowledge and expertise > >>>>> to bear. > >>>>> > >>>>> -Reece > >>>>> > >>>>> On 7/10/20 6:35 AM, Jeff Young wrote: > >>>>>> No, the DRC re-write won’t affect GetSelectMenuText(). It originated > >>>>>> for describing items in the Clarify Selection menu, but it’s now used > >>>>>> whenever we want to describe an item to the user. > >>>>>> > >>>>>>> On 10 Jul 2020, at 00:51, Reece R. Pollack <re...@his.com> wrote: > >>>>>>> > >>>>>>> On 7/9/20 7:09 PM, Tomasz Wlostowski wrote: > >>>>>>>> On 10/07/2020 00:58, Reece R. Pollack wrote: > >>>>>>>>> I'm looking at display origin transformations for DRC reports. > >>>>>>>>> > >>>>>>>>> With the 5.1.x branch Pcbnew, the DRC report dialog box message > >>>>>>>>> texts > >>>>>>>>> contained the Cartesian coordinates of each flagged item. It appears > >>>>>>>>> that the 5.99 branch no longer displays the coordinates of DRC > >>>>>>>>> items. > >>>>>>>>> However, the Cartesian coordinates are still listed in the report > >>>>>>>>> file. > >>>>>>>>> Unlike the display in a dialog box, this report is persistent and > >>>>>>>>> could > >>>>>>>>> be passed to someone using different display origin settings. > >>>>>>>>> > >>>>>>>>> 1. Should these coordinates be reported relative to the page > >>>>>>>>> origin, or > >>>>>>>>> transformed per the user-selected origin and axis directions? > >>>>>>>>> 2. If the coordinates are transformed, should the report include > >>>>>>>>> the > >>>>>>>>> user settings? > >>>>>>>>> > >>>>>>>>> -Reece > >>>>>>>>> > >>>>>>>> Reece, > >>>>>>>> > >>>>>>>> I wouldn't introduce any changes to the current DRC code, we're > >>>>>>>> designing a new DRC engine for KiCad V6 and many things in DRC > >>>>>>>> interface > >>>>>>>> will likely change. > >>>>>>>> > >>>>>>>> IMHO the DRC coordinate transform belongs to the UI, not the DRC > >>>>>>>> itself: > >>>>>>>> - the DRC engine generates an internal report with coordinates in > >>>>>>>> board > >>>>>>>> coordinate space > >>>>>>>> - whatever displays the report to the user (i.e. the DRC dialog) > >>>>>>>> converts the board coordinates to UI coordinates. > >>>>>>>> > >>>>>>>> - my 5 cents > >>>>>>>> Tom > >>>>>>>> > >>>>>>>> > >>>>>>> Tom, > >>>>>>> > >>>>>>> I'm not hard to convince, especially when it means doing less work. > >>>>>>> > >>>>>>> This sounds like the RC_ITEM::ShowCoord function will be removed or > >>>>>>> replaced. It's one of the two troublesome function groups. > >>>>>>> > >>>>>>> The other troublesome function group is the GetSelectMenuText > >>>>>>> function. Last year I knew what they did but I've forgotten in the > >>>>>>> interim. Will this DRC rewrite replace these? > >>>>>>> > >>>>>>> -Reece > >>>>>>> > >>>>>>> _______________________________________________ > >>>>>>> Mailing list: https://launchpad.net/~kicad-developers > >>>>>>> Post to : kicad-developers@lists.launchpad.net > >>>>>>> Unsubscribe : https://launchpad.net/~kicad-developers > >>>>>>> More help : https://help.launchpad.net/ListHelp > >>>>> _______________________________________________ > >>>>> Mailing list: https://launchpad.net/~kicad-developers > >>>>> Post to : kicad-developers@lists.launchpad.net > >>>>> Unsubscribe : https://launchpad.net/~kicad-developers > >>>>> More help : https://help.launchpad.net/ListHelp > _______________________________________________ Mailing list: https://launchpad.net/~kicad-developers Post to : kicad-developers@lists.launchpad.net Unsubscribe : https://launchpad.net/~kicad-developers More help : https://help.launchpad.net/ListHelp