Um script para apoio ao plugin NoteSolver.
Com esse código você pode destacar quais notas já foram adicionadas na lista, os destaques podem ser desativados temporariamente pelo botão do painel. Caso a camada "Notas" seja excluída ou clicado em X no diálogo, as seleções serão perdidas.
Como funciona?
Executar o script
Ligar pintura
Clique para destacar
Clique para remover destaque
Demonstração
Imagem.gif, clique para visualizar.
Código
Última atualização: 2026-01-31
fromorg.openstreetmap.josm.guiimportMainApplication,Notificationfromorg.openstreetmap.josm.gui.layerimportMapViewPaintable,NoteLayer,LayerManagerfromjavax.swingimport(JDialog,JToggleButton,JPanel,JTextArea,JScrollPane,JSlider,JCheckBox,JLabel,SwingUtilities,JOptionPane)fromjava.awtimportColor,BasicStroke,AlphaComposite,BorderLayout,GridLayoutfromjava.awt.geomimportPath2Dimportjava.awt.event# --- Variáveis Globais ---current_note_painter=Nonenotes_to_highlight=set()classNoteHighlighter(MapViewPaintable):def__init__(self,ids_set,transparency,fill_enabled):self.ids_set=ids_setself.transparency=transparencyself.fill_enabled=fill_enableddefpaint(self,g,mv,bbox):ifnotself.ids_set:returng.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,self.transparency))g.setStroke(BasicStroke(1.5))forlayerinMainApplication.getLayerManager().getLayers():ifisinstance(layer,NoteLayer):all_notes=layer.getData().getNotes()fornotainall_notes:ifnota.idinself.ids_set:p=mv.getPoint(nota.getLatLon())self._draw_drop(g,p.x,p.y)def_draw_drop(self,g,x,y):drop=Path2D.Float()drop.moveTo(x,y)drop.curveTo(x-5,y-5,x-7,y-15,x,y-15)drop.curveTo(x+7,y-15,x+5,y-5,x,y)drop.closePath()ifself.fill_enabled:g.setColor(Color.ORANGE)g.fill(drop)g.setColor(Color.ORANGE)g.draw(drop)# --- Funções de Controle ---defatualizar_lista_debug():"""Limpa a depuração e lista apenas os IDs ativos"""debug_area.setText("")sorted_ids=sorted(list(notes_to_highlight))fornote_idinsorted_ids:debug_area.append("Nota: "+str(note_id)+"\n")deflimpar_pintura_mapa():globalcurrent_note_painterifMainApplication.getMap()andMainApplication.getMap().mapView:mv=MainApplication.getMap().mapViewifcurrent_note_painter:mv.removeTemporaryLayer(current_note_painter)current_note_painter=Nonemv.removeMouseListener(mouse_listener)mv.repaint()deffechar_dialogo_completo():limpar_pintura_mapa()MainApplication.getLayerManager().removeLayerChangeListener(layer_listener)ifdialog.isVisible():dialog.dispose()defhandle_click(e):ifnottoggle_btn.isSelected():returnifnotMainApplication.getMap():returnmv=MainApplication.getMap().mapViewclick_p=e.getPoint()nota_encontrada=NoneforlayerinMainApplication.getLayerManager().getLayers():ifisinstance(layer,NoteLayer):forninlayer.getData().getNotes():note_p=mv.getPoint(n.getLatLon())ifclick_p.distance(note_p)<10:nota_encontrada=nbreakifnota_encontrada:ifnota_encontrada.idinnotes_to_highlight:notes_to_highlight.remove(nota_encontrada.id)else:notes_to_highlight.add(nota_encontrada.id)atualizar_lista_debug()mv.repaint()defatualizar_desenho(e=None):globalcurrent_note_painterifnotMainApplication.getMap():returnmv=MainApplication.getMap().mapViewiftoggle_btn.isSelected():ifcurrent_note_painter:mv.removeTemporaryLayer(current_note_painter)transp=slider_transp.getValue()/100.0current_note_painter=NoteHighlighter(notes_to_highlight,transp,chk_fill.isSelected())mv.addTemporaryLayer(current_note_painter)mv.repaint()defon_toggle(e):ifnotMainApplication.getMap()ornotMainApplication.getMap().mapView:toggle_btn.setSelected(False)returniftoggle_btn.isSelected():MainApplication.getMap().mapView.addMouseListener(mouse_listener)atualizar_desenho()toggle_btn.setText("PINTURA: ATIVA")toggle_btn.setBackground(Color(144,255,144))else:limpar_pintura_mapa()toggle_btn.setText("LIGAR PINTURA")toggle_btn.setBackground(None)# --- Monitor de Camadas ---classMyLayerChangeListener(LayerManager.LayerChangeListener):deflayerAdded(self,e):passdeflayerOrderChanged(self,e):passdeflayerRemoving(self,e):ifisinstance(e.getRemovedLayer(),NoteLayer):defacao_remocao():fechar_dialogo_completo()Notification(u"Camada de 'Notas' deletada. Fechando diálogo").setIcon(JOptionPane.WARNING_MESSAGE).show()SwingUtilities.invokeLater(acao_remocao)# --- Adaptadores ---classMapClickAdapter(java.awt.event.MouseAdapter):defmousePressed(self,e):handle_click(e)classWindowCloseAdapter(java.awt.event.WindowAdapter):defwindowClosing(self,e):fechar_dialogo_completo()# --- Verificação Inicial ---definiciar_script():tem_nota=any(isinstance(l,NoteLayer)forlinMainApplication.getLayerManager().getLayers())ifnottem_nota:Notification("Nenhuma camada 'Notas' encontrada.").setIcon(JOptionPane.ERROR_MESSAGE).show()returnglobaldialog,toggle_btn,chk_fill,slider_transp,debug_area,mouse_listener,layer_listenerdialog=JDialog(MainApplication.getMainFrame(),"Note Painter",False)dialog.setLayout(BorderLayout())panel_ctrl=JPanel(GridLayout(0,1))toggle_btn=JToggleButton("LIGAR PINTURA")toggle_btn.setOpaque(True)toggle_btn.addActionListener(on_toggle)chk_fill=JCheckBox("Preenchimento",True)chk_fill.addActionListener(atualizar_desenho)slider_transp=JSlider(0,100,75)slider_transp.addChangeListener(atualizar_desenho)panel_ctrl.add(toggle_btn)panel_ctrl.add(chk_fill)panel_ctrl.add(JLabel(u"Transparência:"))panel_ctrl.add(slider_transp)debug_area=JTextArea(6,10)debug_area.setEditable(False)dialog.add(panel_ctrl,BorderLayout.NORTH)dialog.add(JScrollPane(debug_area),BorderLayout.CENTER)mouse_listener=MapClickAdapter()layer_listener=MyLayerChangeListener()dialog.addWindowListener(WindowCloseAdapter())MainApplication.getLayerManager().addLayerChangeListener(layer_listener)dialog.pack()dialog.setLocationRelativeTo(MainApplication.getMainFrame())dialog.setVisible(True)iniciar_script()