HI, 2013/6/14 Marco Gomes <[email protected]>
> Thank you Jordi for you help.**** > > ** ** > > I finally solve my problem and your algorithm work fine (beside a little > slow refreshing….not sure if I could improve the refresh update to be > quicker and not flicking…).**** > > ** > Yes, the refresh process is quite improved in the master version of Qgis, it seems it now uses a backbuffer to render. I guess you are using 1.8 and that's the reason of the flickering. I finally jumped to master branch and I'm quite happy. > ** > > My problem, were in the figure id that I am using! In my application i set > the figure id, during it's creation, but Qgis internally, modify it and > remade the numeration starting by 1. Not sure if this is a good behavior or > bug.**** > > ** > I think this is a feature, not a bug :). Shapefiles starts to indexing at 1. Cheers. ** > > ** ** > > *From:* Jordi Torres [mailto:[email protected]] > *Sent:* Friday, June 14, 2013 12:39 PM > *To:* Marco Gomes > *Cc:* [email protected] > *Subject:* Re: [Qgis-developer] Using api to move features**** > > ** ** > > Hi Marco, **** > > > I'm using categorized symbology too, the only difference I see is that > I'm not calling > > categorizedSymbolRendererV2->startRender(QgsRenderContext(), symbolsLayer); > **** > > nor **** > > > categorizedSymbolRendererV2->renderFeature(feature, QgsRenderContext(), > symbolsLayer->id().toInt(), false, false);**** > > Maybe you can try a simple example with default simbology and see if it > works ok, and then try to port it to your code. Anyway I'm new to qgis too, > so not an expert here :)**** > > Cheers. **** > > ** ** > > 2013/6/14 Marco Gomes <[email protected]>**** > > Thank you Jordi!**** > > **** > > But i am using a point memory layer as you mention but using special > markers as defined below, and the code that you propose me, do not worked > and my features with the symbols do not move. I need to have any kind of > special consideration when moving feature points with marker symbols > attached?**** > > **** > > //create Vector layer in memory for adding iamge markers**** > > QgsVectorLayer *symbolsLayer = new QgsVectorLayer("Point", > "temporairy_points", "memory");**** > > **** > > QgsVectorDataProvider *provider = symbolsLayer->dataProvider();**** > > **** > > //create new feature**** > > QgsFeature feature = QgsFeature();**** > > **** > > QgsPoint point = > ui.qgsMapCanvas->getCoordinateTransform()->toMapCoordinates(e->pos().x(), > e->pos().y());**** > > QgsGeometry *geometry = geometry->fromPoint(point); **** > > feature.setGeometry(geometry);**** > > **** > > QgsSvgMarkerSymbolLayerV2 svgMarkersymbolLayerV2 = new > QgsSvgMarkerSymbolLayerV2(QCoreApplication::applicationDirPath () + > "/data/symbols/test.svg");**** > > **** > > QgsSymbolLayerV2List symbolLayerV2List;**** > > symbolLayerV2List.clear();**** > > symbolLayerV2List.append(svgMarkersymbolLayerV2);**** > > **** > > QgsMarkerSymbolV2 *markerSymbolV2 = new > QgsMarkerSymbolV2(symbolLayerV2List);**** > > **** > > QgsRendererCategoryV2 *rendererCategoryV2 = new QgsRendererCategoryV2(0, > markerSymbolV2, "0");**** > > **** > > QgsCategoryList categoryList;**** > > categoryList.clear();**** > > categoryList.append(*rendererCategoryV2);**** > > **** > > QgsCategorizedSymbolRendererV2 *categorizedSymbolRendererV2 = new > QgsCategorizedSymbolRendererV2("A", categoryList);**** > > **** > > symbolsLayer->startEditing();**** > > symbolsLayer->setRendererV2(categorizedSymbolRendererV2); ** > ** > > symbolsLayer->addAttribute(QgsField("A", QVariant::String, "String", 4, 0, > ""));**** > > **** > > QList<QgsField> lstFields;**** > > lstFields.insert(0, QgsField("A", QVariant::String, "String", 4, 0, ""));* > *** > > provider->addAttributes(lstFields);**** > > **** > > categorizedSymbolRendererV2->startRender(QgsRenderContext(), symbolsLayer); > **** > > **** > > feature.clearAttributeMap();**** > > QgsAttributeMap attributeMap;**** > > attributeMap.insert(0, "0");**** > > feature.setAttributeMap(attributeMap);**** > > **** > > categorizedSymbolRendererV2->renderFeature(feature, QgsRenderContext(), > symbolsLayer->id().toInt(), false, false);**** > > **** > > QgsFeatureList qgsfeaturesList = QgsFeatureList();**** > > qgsfeaturesList.append(feature);**** > > provider->addFeatures(qgsfeaturesList);**** > > **** > > symbolsLayer->updateExtents();**** > > **** > > // Add the Vector Layer to the Layer Registry**** > > QgsMapLayerRegistry::instance()->addMapLayer(symbolsLayer, false);**** > > **** > > myLayerSet.prepend(QgsMapCanvasLayer(symbolsLayer, true));**** > > **** > > // Set the Map Canvas Layer Set**** > > ui.qgsMapCanvas->setLayerSet(myLayerSet);**** > > **** > > **** > > **** > > *From:* [email protected] [mailto: > [email protected]] *On Behalf Of *Jordi Torres > *Sent:* Friday, June 14, 2013 11:54 AM > *To:* [email protected] > *Subject:* Re: [Qgis-developer] Using api to move features**** > > **** > > One more thing:**** > > > It should be _vectorLayer instead of _contactLayer in the last three lines. > **** > > Cheers.**** > > **** > > 2013/6/14 Jordi Torres <[email protected]>**** > > OOPs forgot to send it to the list.**** > > **** > > Hi Marco, **** > > This is working for me, don't know if is the best option:**** > > //_vector Layer is a point layer in memory**** > > _vectorLayer->startEditing(); > QgsGeometryMap m;**** > > //Pass the feature id and the new x,y**** > > m.insert(feature.id(),*QgsGeometry::fromPoint(QgsPoint(x,y))); > _vectorLayer->dataProvider()->changeGeometryValues(m); > _contactLayer->updateExtents(); > _contactLayer->commitChanges();**** > > _contactLayer.triggerRepaint();**** > > Hope it helps.**** > > **** > > 2013/6/14 Marco Gomes <[email protected]>**** > > I am trying to move features in a Qt timer without success. What it is > missing?**** > > **** > > Below all my trials to make this work. **** > > **** > > //pointMarkersLayer->dataProvider()->changeGeometryValues(geomMap); > **** > > //pointMarkersLayer->updateFeature(featureRoute_p);**** > > **** > > **** > > //pointMarkersLayer->changeGeometry(featureRoute_p.id(), geometry); > **** > > //pointMarkersLayer->moveVertex(finalPoint.x(), finalPoint.y(), > featureRoute_p.id(), 0);**** > > **** > > //pointMarkersLayer->changeGeometry(featureRoute_p.id(), geometry); > **** > > //pointMarkersLayer->updateFeature(featureRoute_p);**** > > //categorizedSymbolRendererV2->renderFeature(featureRoute_p, > QgsRenderContext(), pointMarkersLayer->id().toInt(), false, false);**** > > **** > > //pointMarkersLayer->startEditing();**** > > //pointMarkersLayer->select(featureRoute_p.id(), false);**** > > **** > > //featureRoute_p.setGeometry(QgsGeometry::fromPoint(finalPoint));** > ** > > //pointMarkersLayer->updateFeature(featureRoute_p);**** > > **** > > //float dx = finalPoint.x() - > featureRoute_p.geometry()->asPoint().x();**** > > //float dy = finalPoint.y() - > featureRoute_p.geometry()->asPoint().y();**** > > **** > > //pointMarkersLayer->translateFeature(featureRoute_p.id(), dx, dy); > **** > > **** > > **** > > _______________________________________________ > Qgis-developer mailing list > [email protected] > http://lists.osgeo.org/mailman/listinfo/qgis-developer**** > > > > > -- **** > > Jordi Torres**** > > > > **** > > -- **** > > Jordi Torres**** > > > > > -- **** > > Jordi Torres**** > > > _______________________________________________ > Qgis-developer mailing list > [email protected] > http://lists.osgeo.org/mailman/listinfo/qgis-developer**** > > > > > -- **** > > Jordi Torres > > **** > -- Jordi Torres
_______________________________________________ Qgis-developer mailing list [email protected] http://lists.osgeo.org/mailman/listinfo/qgis-developer
