39
43
SetIsStroke( true );
40
44
SetFillColor( COLOR4D( 0.0, 0.0, 0.0, 0.0 ) );
41
45
SetStrokeColor( COLOR4D( 1.0, 1.0, 1.0, 1.0 ) );
46
SetLookAtPoint( VECTOR2D( 0, 0 ) );
42
47
SetZoomFactor( 1.0 );
48
SetWorldUnitLength( 1.0 / METRIC_UNIT_LENGTH * 2.54 ); // 1 inch in nanometers
49
SetScreenDPI( 106 ); // Display resolution setting
43
50
SetDepthRange( VECTOR2D( GAL::MIN_DEPTH, GAL::MAX_DEPTH ) );
44
51
SetFlip( false, false );
45
52
SetLineWidth( 1.0 );
112
119
SetTarget( TARGET_NONCACHED );
114
121
// Draw the origin marker
115
double origSize = static_cast<double>( gridOriginMarkerSize ) / worldScale;
122
double originSize = gridOriginMarkerSize / worldScale;
116
123
SetLayerDepth( GAL::GRID_DEPTH );
117
124
SetIsFill( false );
118
125
SetIsStroke( true );
119
126
SetStrokeColor( COLOR4D( 1.0, 1.0, 1.0, 1.0 ) );
120
127
SetLineWidth( gridLineWidth / worldScale );
121
DrawLine( gridOrigin + VECTOR2D( -origSize, -origSize ),
122
gridOrigin + VECTOR2D( origSize, origSize ) );
123
DrawLine( gridOrigin + VECTOR2D( -origSize, origSize ),
124
gridOrigin + VECTOR2D( origSize, -origSize ) );
125
DrawCircle( gridOrigin, origSize * 0.7 );
128
DrawLine( gridOrigin + VECTOR2D( -originSize, -originSize ),
129
gridOrigin + VECTOR2D( originSize, originSize ) );
130
DrawLine( gridOrigin + VECTOR2D( -originSize, originSize ),
131
gridOrigin + VECTOR2D( originSize, -originSize ) );
132
DrawCircle( gridOrigin, originSize * 0.7 );
128
135
// For the drawing the start points, end points and increments have
129
136
// to be calculated in world coordinates
130
VECTOR2D worldStartPoint = screenWorldMatrix * VECTOR2D( 0.0, 0.0 );
131
VECTOR2D worldEndPoint = screenWorldMatrix * screenSize;
137
gridOffset = VECTOR2D( (long) gridOrigin.x % (long) gridSize.x,
138
(long) gridOrigin.y % (long) gridSize.y );
140
VECTOR2D worldStartPoint = screenWorldMatrix * VECTOR2D( 0.0, 0.0 );
141
VECTOR2D worldEndPoint = screenWorldMatrix * VECTOR2D( screenSize );
133
143
int gridScreenSizeDense = round( gridSize.x * worldScale );
134
144
int gridScreenSizeCoarse = round( gridSize.x * static_cast<double>( gridTick ) * worldScale );
141
151
if( std::max( gridScreenSizeDense, gridScreenSizeCoarse ) > gridDrawThreshold )
143
153
// Compute grid variables
144
int gridStartX = round( worldStartPoint.x / gridSize.x );
145
int gridEndX = round( worldEndPoint.x / gridSize.x );
146
int gridStartY = round( worldStartPoint.y / gridSize.y );
147
int gridEndY = round( worldEndPoint.y / gridSize.y );
154
int gridStartX = round( worldStartPoint.x / gridSize.x );
155
int gridEndX = round( worldEndPoint.x / gridSize.x );
156
int gridStartY = round( worldStartPoint.y / gridSize.y );
157
int gridEndY = round( worldEndPoint.y / gridSize.y );
149
// Swap the coordinates, if they have not the right order
150
SWAP( gridEndX, <, gridStartX );
151
SWAP( gridEndY, <, gridStartY );
159
assert( gridEndX >= gridStartX );
160
assert( gridEndY >= gridStartY );
153
162
// Correct the index, else some lines are not correctly painted
163
gridStartX -= ( gridOrigin.x / gridSize.x ) + 1;
164
gridStartY -= ( gridOrigin.y / gridSize.y ) + 1;
165
gridEndX += ( gridOrigin.x / gridSize.x ) + 1;
166
gridEndY += ( gridOrigin.y / gridSize.y ) + 1;
159
168
// Draw the grid behind all other layers
160
169
SetLayerDepth( depthRange.y * 0.75 );
166
175
SetStrokeColor( gridColor );
168
177
// Now draw the grid, every coarse grid line gets the double width
169
180
for( int j = gridStartY; j < gridEndY; j += 1 )
171
182
if( j % gridTick == 0 && gridScreenSizeDense > gridDrawThreshold )
176
187
if( ( j % gridTick == 0 && gridScreenSizeCoarse > gridDrawThreshold )
177
188
|| gridScreenSizeDense > gridDrawThreshold )
179
drawGridLine( VECTOR2D( gridStartX * gridSize.x, j * gridSize.y ),
180
VECTOR2D( gridEndX * gridSize.x, j * gridSize.y ) );
190
drawGridLine( VECTOR2D( gridStartX * gridSize.x, j * gridSize.y + gridOrigin.y ),
191
VECTOR2D( gridEndX * gridSize.x, j * gridSize.y + gridOrigin.y ) );
184
196
for( int i = gridStartX; i < gridEndX; i += 1 )
186
198
if( i % gridTick == 0 && gridScreenSizeDense > gridDrawThreshold )
191
203
if( ( i % gridTick == 0 && gridScreenSizeCoarse > gridDrawThreshold )
192
204
|| gridScreenSizeDense > gridDrawThreshold )
194
drawGridLine( VECTOR2D( i * gridSize.x, gridStartY * gridSize.y ),
195
VECTOR2D( i * gridSize.x, gridEndY * gridSize.y ) );
206
drawGridLine( VECTOR2D( i * gridSize.x + gridOrigin.x, gridStartY * gridSize.y ),
207
VECTOR2D( i * gridSize.x + gridOrigin.x, gridEndY * gridSize.y ) );
220
232
if( tickX || tickY || gridScreenSizeDense > gridDrawThreshold )
222
234
double radius = ( tickX && tickY ) ? doubleMarker : marker;
223
DrawRectangle( VECTOR2D( i * gridSize.x - radius,
224
j * gridSize.y - radius ),
225
VECTOR2D( i * gridSize.x + radius,
226
j * gridSize.y + radius ) );
235
DrawRectangle( VECTOR2D( i * gridSize.x - radius + gridOrigin.x,
236
j * gridSize.y - radius + gridOrigin.y ),
237
VECTOR2D( i * gridSize.x + radius + gridOrigin.x,
238
j * gridSize.y + radius + gridOrigin.y ) );
235
VECTOR2D GAL::GetGridPoint( VECTOR2D aPoint ) const
247
VECTOR2D GAL::GetGridPoint( const VECTOR2D& aPoint ) const
237
VECTOR2D pointWorld = ToWorld( aPoint );
239
pointWorld.x = round( pointWorld.x / gridSize.x ) * gridSize.x;
240
pointWorld.y = round( pointWorld.y / gridSize.y ) * gridSize.y;
242
return ToScreen( pointWorld );
249
return VECTOR2D( round( ( aPoint.x - gridOffset.x ) / gridSize.x ) * gridSize.x + gridOffset.x,
250
round( ( aPoint.y - gridOffset.y ) / gridSize.y ) * gridSize.y + gridOffset.y );