Hei Elton, my experimental code is attached. But not sure if it helps you.on vi.. maybe you have to apply the style? or the trick is done by firing the layer-changed event? haven't tested.
stefan Elton Chan wrote:
Hi Stefan, Could you send me your code for my testing as I would like to see how do you update the layerpanel according to order and then update the layerpanel. BTW, following are conditions for my case. i. all features to be displayed are stored in one polygon layer; ii. all features will be displayed at any time step; iii. For each time step, an attribute that controls feature's color would be updated from an event table. The event table stores order, polygon id and color code. iv. After color is updated for all features, it will be shown on the layerpanel. However, the problem I encountered is at step iv. that althrough the attribute can be updated without problem, it cannot be shown/refresh on the layerpanel. For your case, I wonder if you could create a sql query to retrieve particular feature and display at a time. (assume you are using postgis) Thanks, Elton --- On Tue, 7/13/10, Stefan Steiniger <[email protected]> wrote:From: Stefan Steiniger <[email protected]> Subject: Re: [JPP-Devel] how to refresh a layer in run time To: "OpenJump develop and use" <[email protected]> Date: Tuesday, July 13, 2010, 12:15 AM mhm.. not really a solution. I assume that - all features to be displayed are stored in one layer - only one(!) feature needs to be displayed at a time step - one attribute of the layer has the information about thethe order the features are to be displayed.Then I just display the features after each other bymodifying the FeatureCollection of the Layer.Of course I can send the code if someone wants to see/use it. So, quite a bit of assumptions which works for my specialcase - seing how a bear home range evolves over time with the number of new GPS points collected (a home range is a polygon or a multi polygon and I have almost as much polygons as GPS point).stefan Larry Becker schrieb:variable. Have the loop control andHi Elton, Make your loop variable a classthe loop is stillattribute update inside the event handler. Whilethe eventgoing invoke the event handler again, also from withinand invoked it once,handler. Once you have set up the event handlerwould give an example,just fall off the end of the execute routine. Ifor animation. Perhaps he willbut I'm away from my development system. It sounds like Stefan also has a needshow you his solution. Larry On Fri, Jul 9, 2010 at 10:41 PM, Elton Chan <[email protected] <mailto:[email protected]>>wrote:Dear Larry, Could you tell me how itworks? It seems a loop is required forcontinous update an attribute.How can it be replaced by a eventhandler? Thanks, Elton --- On *Fri, 7/2/10, LarryBecker /<[email protected]<mailto:[email protected]>>/*wrote:From: LarryBecker <[email protected]<mailto:[email protected]>> Subject: Re:[JPP-Devel] how to refresh a layer in run timeTo: "OpenJumpdevelop and use"<[email protected] <mailto:[email protected]>> Date: Friday,July 2, 2010, 5:33 PMHi Elton, I thinkyou are going to have to restructure you code from aloop to be anevent handler that triggers itself until the endof somecounter. That is the only sure way to play nice withthe GUI. Larry On Fri, Jul 2,2010 at 12:06 PM, Elton Chan<[email protected] <http://mc/[email protected]>>wrote:HiLarry,I've tried the LayerView Panel().repaint() withInvokeAndWait(). However, the layerpanel still cannot refeshand the for loop continues until all finishing all theRecordset.The following code is added after attribute update:if(SwingUtilities.isEventDispatchThread()) {context.getLayerViewPanel().repaint();System.out.println("repaint!!");<<<< Alwayshit this line.}else {SwingUtilities.invokeAndWait(new Runnable() {public void run( ) {context.getLayerViewPanel().repaint();System.out.println("repaint!!!");}});}Any idea?--- On *Thu, 7/1/10, Larry Becker /<[email protected]<http://mc/[email protected]>>/* wrote:From: Larry Becker <[email protected]<http://mc/[email protected]>>Subject: Re: [JPP-Devel] how to refresh a layer in run timeTo: "OpenJump develop and use"<[email protected]<http://mc/[email protected]>>Date: Thursday, July 1, 2010, 2:30 PMSorry, Elton, not NIls. I answered so many questionsthat I got confused about who I was answering. :-)On Thu, Jul 1, 2010 at 8:24 AM, Larry Becker<[email protected]<http://mc/[email protected]>> wrote:Hi Nils,I believe you might be running into problemsupdating because your loop is blocking the GUIthread. You might try a LayerViewPanel.repaint()using invokeAndWait().LarryOn Thu, Jul 1, 2010 at 6:42 AM, Elton Chan<[email protected]<http://mc/[email protected]>> wrote:Hi there,I would like to refresh a layer after changingattribute of each feature in the layer based onan event table. The event table recordsattribute assigned to each feature at specifiedstage. Following is the schema of the event table:Event(StageID int, // StageID defines sequence of theeventFeature01 int, // value to be assigned to feature 01Feature02 int, // value to be assigned to feature 02...Feature10 int)Based on the StageID sequence, values for eachfeature would be retrieved and updated tocorresponding feature. Finally, update valuewould be visualized by unique colortheming.However, it seems the layer refreshing can onlybe effective outside the ResultSet loop of theevent table.The following is the program codes:Inside execute(PlugInContext context)// get a layerlyr = context.getLayerManager().getLayer("postgis");//create a Resultset RSResultSet RS stat.executeQuery("select * fromEvent");while (RS.next()){updatePostgisLayer(lyr, RS);//Thisfunctionupdates feature in the layer}< layer refreshes after the looping all theresultset.My question is how to refresh the layer onceattribute values are updated for each each rowof the RecordSet, i.e. immediately after theupdatePostgisLayer function.If I change the query to retrieve specify row(i.e. single row only), layer can be refreshed.But it requires to activate it manually for eachupdate.I tried to addlyr.fireLayerChanged(LayerEventType.APPEARANCE_CHANGED);or lyr.fireAppearanceChanged() after theupdatePostgisLayer function but it didn't work.Anyone can help?thanks,Elton------------------------------------------------------------------------------This SF.net email is sponsored by SprintWhat will you do first with EVO, the first 4G phone?Visit sprint.com/first <http://sprint.com/first>-- http://p.sf.net/sfu/sprint-com-first_______________________________________________Jump-pilot-devel mailing list[email protected]<http://mc/[email protected]>https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel-----Inline Attachment Follows-----------------------------------------------------------------------------------This SF.net email is sponsored by SprintWhat will you do first with EVO, the first 4G phone?Visit sprint.com/first <http://sprint.com/first> --http://p.sf.net/sfu/sprint-com-first-----Inline Attachment Follows-----_______________________________________________Jump-pilot-devel mailing list[email protected]<http://mc/[email protected]>https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel------------------------------------------------------------------------------This SF.net email is sponsored by SprintWhat will you do first with EVO, the first 4G phone?Visit sprint.com/first <http://sprint.com/first> --http://p.sf.net/sfu/sprint-com-first_______________________________________________Jump-pilot-devel mailing list[email protected]<http://mc/[email protected]>https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel -----InlineAttachment Follows-----------------------------------------------------------------------------------This SF.netemail is sponsored by SprintWhat will you dofirst with EVO, the first 4G phone?Visitsprint.com/first <http://sprint.com/first> --http://p.sf.net/sfu/sprint-com-first -----InlineAttachment Follows-----_______________________________________________Jump-pilot-develmailing list[email protected] <http://mc/[email protected]> https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel------------------------------------------------------------------------------This SF.net email is sponsoredby SprintWhat will you do first withEVO, the first 4G phone?Visit sprint.com/first <http://sprint.com/first> -- http://p.sf.net/sfu/sprint-com-first_______________________________________________Jump-pilot-devel mailing list [email protected] <mailto:[email protected]> https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel------------------------------------------------------------------------------------------------------------------------------------------------------This SF.net email is sponsored by Sprint What will you do first with EVO, the first 4G phone? Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first------------------------------------------------------------------------_______________________________________________ Jump-pilot-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel------------------------------------------------------------------------------ This SF.net email is sponsored by Sprint What will you do first with EVO, the first 4G phone? Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first _______________________________________________ Jump-pilot-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel------------------------------------------------------------------------------ This SF.net email is sponsored by Sprint What will you do first with EVO, the first 4G phone? Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first _______________________________________________ Jump-pilot-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel
/* * The Unified Mapping Platform (JUMP) is an extensible, interactive GUI * for visualizing and manipulating spatial features with geometry and attributes. * * JUMP is Copyright (C) 2003 Vivid Solutions * * This class implements extensions to JUMP and is * Copyright (C) Stefan Steiniger. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * For more information, contact: * Stefan Steiniger * [email protected] */ /***************************************************** * created: 08.July.2010 * last modified: * * * @author sstein * * description: * * *****************************************************/ package ca.ucalgary.engg.moveantools.ojplugin.hranalysis; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.swing.DefaultComboBoxModel; import javax.swing.JComboBox; import org.openjump.core.apitools.FeatureCollectionTools; import org.openjump.core.apitools.FeatureSchemaTools; import ca.ucalgary.engg.moveantools.util.TrackCalculationUtil; import com.vividsolutions.jump.feature.Feature; import com.vividsolutions.jump.feature.FeatureCollection; import com.vividsolutions.jump.feature.FeatureDataset; import com.vividsolutions.jump.task.TaskMonitor; import com.vividsolutions.jump.workbench.WorkbenchContext; import com.vividsolutions.jump.workbench.model.Layer; import com.vividsolutions.jump.workbench.model.LayerEventType; import com.vividsolutions.jump.workbench.model.LayerManager; import com.vividsolutions.jump.workbench.model.StandardCategoryNames; import com.vividsolutions.jump.workbench.plugin.AbstractPlugIn; import com.vividsolutions.jump.workbench.plugin.EnableCheckFactory; import com.vividsolutions.jump.workbench.plugin.MultiEnableCheck; import com.vividsolutions.jump.workbench.plugin.PlugInContext; import com.vividsolutions.jump.workbench.plugin.ThreadedPlugIn; import com.vividsolutions.jump.workbench.ui.GUIUtil; import com.vividsolutions.jump.workbench.ui.LayerViewPanel; import com.vividsolutions.jump.workbench.ui.LayerViewPanelContext; import com.vividsolutions.jump.workbench.ui.MultiInputDialog; import com.vividsolutions.jump.workbench.ui.plugin.FeatureInstaller; import com.vividsolutions.jump.workbench.ui.renderer.RenderingManager; import com.vividsolutions.jump.workbench.ui.renderer.ThreadQueue; import com.vividsolutions.jump.workbench.ui.renderer.style.BasicStyle; import com.vividsolutions.jump.workbench.ui.style.CopyStylesPlugIn; /** * @description: * * @author sstein * **/ public class AsymptoteMoviePlugIn extends AbstractPlugIn implements ThreadedPlugIn{ private String sSidebar ="Displays the Home Ranges created with the Asymptote Anlysis Function"; private final String sLAYERPTS = "Layer with HomeRanges"; private FeatureCollection points = null; private Layer input = null; private MultiInputDialog dialog; private PlugInContext context = null; private JComboBox jcb_attributeA = null; private String locAttribute = ""; private String sATTRIBUTEA = "time attribute [for ordering of features]"; private RenderingManager renderingManager; private LayerViewPanel panel = null; public void initialize(PlugInContext context) throws Exception { FeatureInstaller featureInstaller = new FeatureInstaller(context.getWorkbenchContext()); featureInstaller.addMainMenuItem( this, //exe new String[] {"MOVEAN", "HR Analysis"}, //menu path "Asymptote Movie", //AbstractPlugIn.createName(CalculateMinimumConvexPolygonPlugIn.class), false, //checkbox null, //icon createEnableCheck(context.getWorkbenchContext())); //enable check } public static MultiEnableCheck createEnableCheck(WorkbenchContext workbenchContext) { EnableCheckFactory checkFactory = new EnableCheckFactory(workbenchContext); return new MultiEnableCheck() .add(checkFactory.createAtLeastNLayersMustExistCheck(1)); } public boolean execute(PlugInContext context) throws Exception{ //Unlike ValidatePlugIn, here we always call #initDialog because we want //to update the layer comboboxes. initDialog(context); dialog.setVisible(true); if (!dialog.wasOKPressed()) { return false; } else{ this.getDialogValues(dialog); } return true; } public void run(TaskMonitor monitor, PlugInContext context) throws Exception{ System.gc(); //flush garbage collector this.context = context; monitor.allowCancellationRequests(); FeatureCollection resultC = new FeatureDataset(this.points.getFeatureSchema()); //-- clone the original layers style & make invisible Collection stylesBuffer = this.input.cloneStyles(); this.input.setVisible(false); //-- order the objects ArrayList<Feature> sortedFeatures = FeatureCollectionTools.sortFeatureListByAttributeBeginWithSmallest(this.points.getFeatures(), locAttribute); //-- add the first object Feature oldFeature = sortedFeatures.get(0); Feature oldoldFeature = oldFeature; resultC.add(oldFeature); int numFeatures = sortedFeatures.size(); Layer movieLayer = null; if((resultC != null) && (resultC.size() > 0)){ movieLayer = context.addLayer(StandardCategoryNames.SYSTEM, "movie", resultC); movieLayer.setDrawingLast(true); movieLayer.setStyles(stylesBuffer); for (int i = 1; i < numFeatures; i++) { monitor.report(i, numFeatures, ""); if(monitor.isCancelRequested()){ //-- remove the temporary layer & make the original layer visible LayerManager lm = movieLayer.getLayerManager(); lm.remove(movieLayer); this.input.setVisible(true); return; } Feature newFeature = sortedFeatures.get(i); movieLayer.setFeatureCollectionModified(false); //-- remove the secondLast item // hence we will always display the new and the old item // this may be smoother? if(i > 1){ resultC.remove(oldoldFeature); } //-- add the next item resultC.add(newFeature); movieLayer.setFeatureCollectionModified(true); movieLayer.fireLayerChanged(LayerEventType.APPEARANCE_CHANGED); oldoldFeature = oldFeature; oldFeature = newFeature; //-- waste some time by drawing the same thing again completly new // to ensure rendering is finished /** * TODO: * put stuff for testing in a subclass for now. * The problem is to get info about * when rendering is finished. Larry said that SkyJUMP has a listener * for that - but this one works not in all cases. [see his email from * 9 July 2010: Plug-in showing change over time] */ //this.wasteTime(resultC); Thread.sleep(30); } } //-- remove the temporary layer & make the original layer visible LayerManager lm = movieLayer.getLayerManager(); lm.remove(movieLayer); this.input.setVisible(true); } private void initDialog(PlugInContext context) { dialog = new MultiInputDialog(context.getWorkbenchFrame(), "Asymptote Movie", true); dialog.setSideBarDescription(sSidebar); try { JComboBox addLayerComboBoxRegions = dialog.addLayerComboBox(this.sLAYERPTS, context.getCandidateLayer(0), null, context.getLayerManager()); } catch (IndexOutOfBoundsException e) {} List list = FeatureSchemaTools.getFieldsFromLayerWithoutGeometryAndString(context.getCandidateLayer(0)); Object valA = list.size()>0?list.iterator().next():null; jcb_attributeA = dialog.addComboBox(this.sATTRIBUTEA, valA, list,this.sATTRIBUTEA); if (list.size() == 0) jcb_attributeA.setEnabled(false); dialog.getComboBox(this.sLAYERPTS).addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { List list = getFieldsFromLayerWithoutGeometryAndString(); if (list.size() == 0) { jcb_attributeA.setModel(new DefaultComboBoxModel(new String[0])); jcb_attributeA.setEnabled(false); } jcb_attributeA.setModel(new DefaultComboBoxModel(list.toArray(new String[0]))); } }); //dialog.addDoubleField(T1, 20.0, 4); GUIUtil.centreOnWindow(dialog); } private void getDialogValues(MultiInputDialog dialog) { this.input = dialog.getLayer(this.sLAYERPTS); this.points= this.input.getFeatureCollectionWrapper(); this.locAttribute = dialog.getText(this.sATTRIBUTEA); } private List getFieldsFromLayerWithoutGeometryAndString() { return FeatureSchemaTools.getFieldsFromLayerWithoutGeometryAndString(dialog.getLayer(this.sLAYERPTS)); } private void wasteTime(FeatureCollection fc) throws InterruptedException{ //-- create a new dummy pannel to have a clue when things are drawn final Throwable[] throwable = new Throwable[] { null }; LayerManager dummyLM = new LayerManager(); LayerViewPanel dummyPanel = new LayerViewPanel( new LayerManager(), new LayerViewPanelContext() { public void setStatusMessage(String message) { } public void warnUser(String warning) { } public void handleThrowable(Throwable t) { throwable[0] = t; } }); //-- here I render a dummy Layer so I know when things are drawn for sure. //-- copied the part below from org.openjump.core.ui.plugin.file.LayerPrinter2 Layer dummyLayer = dummyLM.addLayer("huhu", "dummyLayer", fc); renderingManager = dummyPanel.getRenderingManager(); renderingManager.renderAll(); /* ThreadQueue runningThreads = renderingManager.getDefaultRendererThreadQueue(); while (runningThreads.getRunningThreads()>0){ //-- just wait //System.out.println("waiting, i: " + i); Thread.sleep(10); } dummyLM.remove(dummyLayer); */ } }
------------------------------------------------------------------------------ This SF.net email is sponsored by Sprint What will you do first with EVO, the first 4G phone? Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first
_______________________________________________ Jump-pilot-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel
