← Back to team overview

kicad-developers team mailing list archive

Re: specctra roundtripper

 

On 4/14/2012 2:14 PM, Dick Hollenbeck wrote:
> On 04/14/2012 10:06 AM, Wayne Stambaugh wrote:
>> On 4/13/2012 3:03 PM, Dick Hollenbeck wrote:
>>> On 04/13/2012 12:00 PM, Wayne Stambaugh wrote:
>>>> On 4/13/2012 10:04 AM, Dick Hollenbeck wrote:
>>>>>> Also, you may want to
>>>>>> change Mils2iu to use wxRound() so it will work for negative values.
>>>>> wxRound()'s use of C lib's round() seems like overkill to me.
>>>>> Since the objective is to produce an integer, not a double, there is an easier way that
>>>>> has the possibility of letting the compiler do some of the work, i.e. in advance, on
>>>>> constants,
>>>>> without the overhead of a mandatory floating point function call.
>>>>>
>>>>> See my latest DMils2iu() as a suggestion.
>>>>>
>>>>>
>>>>> Dick
>>>> wxRound may be overkill but it does one important thing that will become
>>>> apparent when I commit the code that scales the PCB_SCREEN zoom factors
>>>> to work properly with nanometer internal units.  In debug builds,
>>>> wxRound tests if the floating point result is within INT_MIN and INT_MAX
>>>> and raises an assertion if it is not.  I found out that this assertion
>>>> occurs in the wxDC::LogicalToDevice() functions when zooming way out
>>>> when Pcbnew is compiled for nanometers.
>>> You are saying that this assert fires when precisely within wxDC::LogicalToDevice(), still
>>> within wx not inside gtk, correct?
>>>
>>> Can you give a filename and approximate line number of code please?
>>>
>>> Then we can and should add similar asserts.  wxRound() use of c lib round() is not
>>> warranted, and removes compile time code reduction opportunities.
>> Here's the back trace on the debug build Windows using wxWidgets 2.9.3:
>>
>> #0  0x7c90120f in ntdll!DbgUiConnectToDbg ()
>>    from C:\WINDOWS\system32\ntdll.dll
>> #1  0x0086b0cc in wxTrap ()
>>     at e:/src/wxWidgets-2.9.3/src/common/appbase.cpp:1015
>> #2  0x0086b138 in wxDefaultAssertHandler (file=..., line=120, func=...,
>>     cond=..., msg=...) at e:/src/wxWidgets-2.9.3/src/common/appbase.cpp:1044
>> #3  0x0086b888 in wxOnAssert (
>>     file=0xb8d428 "E:/MinGW/include/wx-2.9/wx/math.h", line=120,
>>     func=0xb8d901 "wxRound",
>>     cond=0xb8d400 "x > INT_MIN - 0.5 && x < INT_MAX + 0.5",
>>     msg=0xb8d3c0 L"argument out of supported range")
>>     at e:/src/wxWidgets-2.9.3/src/common/appbase.cpp:1145
>> #4  0x0094a363 in wxRound (x=2672080000)
>>     at E:/MinGW/include/wx-2.9/wx/math.h:120
>> #5  0x00727a29 in wxDCImpl::DeviceToLogicalXRel (this=0x1def4d98, x=1052)
>>     at e:/src/wxWidgets-2.9.3/src/common/dcbase.cpp:390
>> #6  0x00a55727 in wxDC::DeviceToLogicalXRel (this=0x22dd50, x=1052)
>>     at E:/MinGW/include/wx-2.9/wx/dc.h:999
>> #7  0x005fb11a in EDA_DRAW_PANEL::SetClipBox (this=0x1de96e58, aDC=...,
>>     aRect=0x0) at e:/src/kicad-testing/dev-branch/common/drawpanel.cpp:455
>> #8  0x005fb4b9 in EDA_DRAW_PANEL::DoPrepareDC (this=0x1de96e58, dc=...)
>>     at e:/src/kicad-testing/dev-branch/common/drawpanel.cpp:494
>> #9  0x005fb542 in EDA_DRAW_PANEL::OnPaint (this=0x1de96e58, event=...)
>>     at e:/src/kicad-testing/dev-branch/common/drawpanel.cpp:508
>>
>> The assertion is happening in wx/math.h in the wxRound() function when
>> repainting the display after the zoom.  I will shortly be committing the
>> changes that scale the worksheet reference and title block and the
>> Pcbnew zoom and grid sizes to accommodate nanometers so that you can
>> play around with it to get a feel for some of the issues that will need
>> to be resolve before nanometers can become the default internal units
>> for Pcbnew.
> 
> I was able to duplicate this shortly after you reported it yesterday, and found that that
> patch I sent to the list fixed this one.
> 
> We were assigning m_ZoomList[0] to an integer, and the value being assigned was 0.5, so
> when this conversion took place to int, you ended up with zero.
> 
> Then that zero was sent into wx and was used to calculate some scaling constant in there,
> the 0 went into the denominator of a calculation, leaving the dividend at infinity.
> 
> So anything coming in after that would blow up because it was being multiplied by infinity.
> 
> I no longer see this error, but certainly the zooming is not smooth yet.  I think we are
> just at the next in a series of hurdles which we'll have to knock over.
> 
> Dick
> 

Excellent!  Thanks for fixing this.

Wayne


References