Just to clarify, QGraphicsScene by itself doesn&#39;t have any particular units.&nbsp; The composer treats scene units as millimeters, but I don&#39;t think there&#39;s anything special about millimeters in particular.<br>I&#39;m a little confused as to why you wouldn&#39;t put the units in QgsSymbol.&nbsp; I see it as an attribute just like size or color.&nbsp; In theory, we might want a uniqueValueRenderer which renders different objects with different scale types.&nbsp; This seems harder to do if a higher-level class is doing the scaling.<br>

Steven<br><br><div class="gmail_quote">On Fri, Mar 7, 2008 at 2:46 AM, Marco Hugentobler &lt;<a href="mailto:marco.hugentobler@karto.baug.ethz.ch" target="_blank">marco.hugentobler@karto.baug.ethz.ch</a>&gt; wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

Hi Steven,<br>
<br>
Many thanks for pointing this out. I was not aware that QgsGraphicsScene<br>
always has mm units.<br>
<br>
It would be a possibility that QGIS main map also switches to mm units. In<br>
this case QgsMapCanvasMap would determine the scale factor to transform pixel<br>
to mm and configure a QgsMapRenderContext containing this factor. I think it<br>
is not necessary that QgsSymbol knows its units. Higher level classes that<br>
configure the rendering context could do this and just pass the scale factor.<br>
<br>
The other way round would be that QGIS main canvas still has pixel units and<br>
print composer queries dpi of the map image and scales its widths and sizes<br>
to achieve wysiwyg. In my opinion, the global mm approach seems more general.<br>
<br>
Regards,<br>
Marco<br>
<br>
<br>
<br>
<br>
Am Donnerstag 06 März 2008 01:08:46 schrieb Steven Bell:<br>
<div><div></div><div>&gt; After thinking and looking at the code a little, I definitely didn&#39;t<br>
&gt; explain that very well...<br>
&gt;<br>
&gt; As you know, what you see in the main editing canvas is not always what you<br>
&gt; get in the composer. &nbsp;Likewise,what you see when using the cache preview in<br>
&gt; the composer is not what you get when you render.<br>
&gt;<br>
&gt; The root of the problem is that QGIS does all of its drawing in canvas<br>
&gt; units, so when you switch canvases, you change how things look. &nbsp;The map<br>
&gt; composer uses millimeters - one QGraphicsScene unit is one mm.<br>
&gt; Printers and PDF output both work with millimeters this way. &nbsp;If I make a<br>
&gt; QGraphicsRectItem with a size of 10mm square, it will come out 10mm square.<br>
&gt; If the pen width is 1 scene unit (and isn&#39;t scaled), it will come out 1 mm<br>
&gt; wide.<br>
&gt;<br>
&gt; Note that when the composer map cache pixmap is drawn, the sizes are all in<br>
&gt; pixels again. &nbsp;Thus, as the resolution of the cache image changes, the line<br>
&gt; widths and symbol sizes all change. &nbsp;This has caused a lot of confusion,<br>
&gt; because although the rendered preview matches the rendered output, the<br>
&gt; cached preview does not.<br>
&gt;<br>
&gt; I&#39;m not completely clear on what the DPI setting in the composer actually<br>
&gt; does when doing a vector output such as SVG or Postscript. &nbsp;Changing that<br>
&gt; setting doesn&#39;t seem to affect them, but the vector output code does<br>
&gt; reference it. &nbsp;I think the SVG generator needs to know something about the<br>
&gt; size/dpi so that rasterizers/renderers can render them properly.<br>
&gt;<br>
&gt; What I did in the composer redesign branch was add an enum, mScaleType,<br>
&gt; which tells the renderer what units the size is in. &nbsp;The renderer sets a<br>
&gt; size scale, which is dependent on the scale type, size, and current mupp<br>
&gt; (map units per pixel). &nbsp;Also, rather than setting a pointer to a pixmap, it<br>
&gt; sets a pointer to a symbol renderer which will always render the symbol<br>
&gt; with a size of 1. &nbsp;QgsVectorLayer&#39;s drawFeature( ) method scales the<br>
&gt; painter by the size scale and calls the symbolRenderer&#39;s render( ) method.<br>
&gt;<br>
&gt; Since this appears to be much slower than the current code, we probably<br>
&gt; need to do some context-dependent caching.<br>
&gt;<br>
&gt; In the rendering context, we would need to include some information about<br>
&gt; whether we were rendering in screen units or paper units. &nbsp;Perhaps more<br>
&gt; correctly, we would like to know the output DPI, which will be one<br>
&gt; (system-dependent) thing for the editing canvas, 25.4 for the composer<br>
&gt; canvas, and some variable for the composer map cache. &nbsp;Because of the way<br>
&gt; the physical output is handled, I don&#39;t think we need to know or care what<br>
&gt; the printer&#39;s DPI is.<br>
&gt;<br>
&gt; This should enable the removal of the symbol/line width/text scale options<br>
&gt; in the composer. &nbsp;This also allows us to use the QgsMapRender class to<br>
&gt; render the map, rather than having a bunch of almost-duplicate code. &nbsp;The<br>
&gt; code currently in composer_redesign uses QgsMapRender, but I haven&#39;t taken<br>
&gt; the time to remove the scale boxes in the map control pane.<br>
&gt;<br>
&gt; Let me know if this still isn&#39;t clear. &nbsp;I haven&#39;t completely sorted it all<br>
&gt; out, either. :-)<br>
&gt;<br>
&gt; Steven<br>
&gt;<br>
&gt;<br>
&gt; On Wed, Mar 5, 2008 at 4:09 AM, Marco Hugentobler &lt;<br>
&gt;<br>
&gt; <a href="mailto:marco.hugentobler@karto.baug.ethz.ch" target="_blank">marco.hugentobler@karto.baug.ethz.ch</a>&gt; wrote:<br>
&gt; &gt; Hi Steven,<br>
&gt; &gt;<br>
&gt; &gt; &gt; I would remove symbolScale and widthScale in favor of defining the<br>
&gt; &gt;<br>
&gt; &gt; widths<br>
&gt; &gt;<br>
&gt; &gt; &gt; in terms of concrete units, whether pixels, millimeters, or map units.<br>
&gt; &gt;<br>
&gt; &gt; It would be good for me if you could explain this idea in more detail as<br>
&gt; &gt; I&#39;m<br>
&gt; &gt; still not sure my understanding is correct.<br>
&gt; &gt;<br>
&gt; &gt; Do you mean that QgsSymbol should have its own pen width and stroke<br>
&gt; &gt; width? They would be specified e.g. in mm instead of pixels and when the<br>
&gt; &gt; symbol is<br>
&gt; &gt; applied, transformed to pixels according to the ouput device dpi?<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt; The idea that i had was to just work on pixel level with one scalefactor<br>
&gt; &gt; (mResolutionRatio). So if e.g. a printer has a resolution of screen dpi *<br>
&gt; &gt; 2,<br>
&gt; &gt; then mResolutionRatio would be 2 and all the width values for QPen,<br>
&gt; &gt; QBrush and also width/height for images would be scaled by factor 2.<br>
&gt; &gt; Caching pixmaps<br>
&gt; &gt; would only be alloud if mResolutionRatio is 1.<br>
&gt; &gt;<br>
&gt; &gt; I think that would be doable without many code changes. But it is not as<br>
&gt; &gt; generic and clean as working with real units (e.g. mm) in the qgis core.<br>
&gt; &gt;<br>
&gt; &gt; Regards,<br>
&gt; &gt; Marco<br>
&gt; &gt;<br>
&gt; &gt; Am Dienstag 04 März 2008 17:26:08 schrieb Steven Bell:<br>
&gt; &gt; &gt; &gt; So my suggestion is to have the rendering context somehow like this:<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; class QgsMapRenderContext<br>
&gt; &gt; &gt; &gt; {<br>
&gt; &gt; &gt; &gt; &nbsp; &nbsp; &nbsp; &nbsp;QgsMapToPixel mMapToPixel;<br>
&gt; &gt; &gt; &gt; &nbsp; &nbsp; &nbsp; &nbsp;QgsCoordinateTransform mCoordTransform;<br>
&gt; &gt; &gt; &gt; &nbsp; &nbsp; &nbsp; &nbsp;QgsRect mExtent;<br>
&gt; &gt; &gt; &gt; &nbsp; &nbsp; &nbsp; &nbsp;bool drawEditingInformation;<br>
&gt; &gt; &gt; &gt; &nbsp; &nbsp; &nbsp; &nbsp;bool mRenderingStopped;<br>
&gt; &gt; &gt; &gt; &nbsp; &nbsp; &nbsp; &nbsp;double mResolutionRatio;<br>
&gt; &gt; &gt; &gt; };<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; The resolution ratio is usually 1, except when drawing to a different<br>
&gt; &gt; &gt; &gt; paint<br>
&gt; &gt; &gt; &gt; device (like QPrinter). I hope it will allow to consider for<br>
&gt; &gt; &gt; &gt; different line<br>
&gt; &gt; &gt; &gt; width / symbol sizes on these output devices.<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt;From what I understand, QgsMapToPixel basically holds the information<br>
&gt; &gt;<br>
&gt; &gt; that<br>
&gt; &gt;<br>
&gt; &gt; &gt; mResolutionRatio would contain.<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; Martin already mentioned this, but the rendering context needs to have<br>
&gt; &gt;<br>
&gt; &gt; some<br>
&gt; &gt;<br>
&gt; &gt; &gt; way to tell the renderer whether to use maximum-resolution vector ouput<br>
&gt; &gt;<br>
&gt; &gt; or<br>
&gt; &gt;<br>
&gt; &gt; &gt; cached pixmaps. &nbsp;I would also add something about what the output units<br>
&gt; &gt; &gt; are, whether pixels or millimeters. &nbsp;Both of the above might be done<br>
&gt; &gt; &gt; together with an &quot;are we printing to ps/pdf/svg&quot; bool.<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; I would remove symbolScale and widthScale in favor of defining the<br>
&gt; &gt;<br>
&gt; &gt; widths<br>
&gt; &gt;<br>
&gt; &gt; &gt; in terms of concrete units, whether pixels, millimeters, or map units.<br>
&gt; &gt; &gt; This is what I have attempted to do in the current composer_redesign<br>
&gt; &gt;<br>
&gt; &gt; code.<br>
&gt; &gt;<br>
&gt; &gt; &gt; One of the major problems is that printed millimeters are treated as<br>
&gt; &gt; &gt; the same as screen pixels, rather than a separate but similar type of<br>
&gt; &gt; &gt; measurement.<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; I hope this makes sense. &nbsp;Let me know if I need to clarify anything.<br>
&gt; &gt; &gt; Steven<br>
&gt; &gt;<br>
&gt; &gt; --<br>
&gt; &gt; Dr. Marco Hugentobler<br>
&gt; &gt; Institute of Cartography<br>
&gt; &gt; ETH Zurich<br>
&gt; &gt; Technical Advisor QGIS Project Steering Committee<br>
<br>
<br>
<br>
</div></div>--<br>
<div><div></div><div>Dr. Marco Hugentobler<br>
Institute of Cartography<br>
ETH Zurich<br>
Technical Advisor QGIS Project Steering Committee<br>
</div></div></blockquote></div><br>