Notifications
Clear all

[Closed] Marquee with mouse tool

Hi all,
I was wondering if there is a way to easily display a marquee with a mouse tool–the mouse tool function can return the viewpoint (point2 loc of mouse in viewport), but I can’t find a function to display a marquee in the reference. The script I’m working on has two mouse clicks involved, one that gets the start position and one that gets the end position.

4 Replies
1 Reply
(@bobo)
Joined: 1 year ago

Posts: 0

Take a look at the gw. drawing methods. These allow you to draw graphic primitives and text staight to the viewport.

Thanks Bobo,

With drawing the polyline – since it requires point3 data and I’m wanting to go off of point2 derived from the viewpoint in a mousetool, I’m running into a problem in the conversion. Anytime I send point3’s to the gw methods, it uses the currently active viewport’s transform matrix. Is there a way I can override this and supply my own matrix? I’ve tried using the mapscreentoview function, but again, this only supplies point3’s using the current transform matrix. Running into a wall here! Been at it for a few days – I’ve only been able to draw my polyline in the top view successfully since this viewport inately has the necessary transform matrix (matrix3 [1,0,0] [0,1,0] [0,0,1] [0,0,0]). Even though it draws here, there’re strange things involving the updating of it. gw.updatescreen() doesn’t seem to work all the time?

1 Reply
(@bobo)
Joined: 1 year ago

Posts: 0


(
global testMarquee 
try(destroyDialog testMarquee)catch()
rollout testMarquee "Marquee Test"
(
	local theLine = #()
	checkbox enableIt "Enable"
	timer theTimer interval:50 active:false
	button resetLine "Reset"
	
	on enableIt changed state do theTimer.active = state
	on resetLine pressed do theLine = #()
	
	on theTimer tick do
	(
		if mouse.buttonStates[1] == true then
		(
			thePos = mouse.pos
			append theLine [thePos.x, thePos.y, 0]
			gw.setTransform (viewport.getTM())
			gw.wpolyLine theLine false 
			gw.enlargeUpdateRect #whole
			gw.updateScreen()
		)
		else
			theLine = #()	
	)
)
createDialog testMarquee 
)

First, set the transformation matrix to the TM of the current view.
Then draw the polyline, enlarge the update rectange to the whole screen and update the screen. It is a good idea to set the driver to “Redraw On Windows Expose” for clean results.

Start the tool, check the checkbox, click in a viewport and drag while holding the left mouse button pressed.

Awesome, thanks again Bobo. I incorporated it into a render region tool:


      tool getRegion
      	(
      		local firstcoord
      		local secondcoord
      		local viewsize
      		local finalregion
      		local marquee = #(0, 0, 0, 0)
      		
      		on mousepoint clickno do
      		(
      			if clickno == 1 do
      			(
      				viewsize = getviewsize()
      				firstcoord = viewpoint
 				marquee[1] = [viewpoint.x, viewpoint.y, 0]
      			)
      			
      			if clickno == 2 do
      			(
      				secondcoord = viewpoint
 				if firstcoord.x > secondcoord.x do
      				(
 					local fx = firstcoord.x
 					local sx = secondcoord.x
 					firstcoord.x = sx
 					secondcoord.x = fx
      				)
 				if firstcoord.y > secondcoord.y do
      				(
 					local fy = firstcoord.y
 					local sy = secondcoord.y
 					firstcoord.y = sy
 					secondcoord.y = fy
      				)
 		 	finalregion = box2 firstcoord.x firstcoord.y (secondcoord.x - firstcoord.x) (secondcoord.y - firstcoord.y)
 		 	render outputwidth:viewsize.x outputheight:viewsize.y rendertype:#regioncrop region:finalregion
   			stoptool getRegion
      			)
      		)
      		
      		on mousemove clickno do
      		(
      			completeredraw()
      			gw.setcolor #line (color 125 175 255)
      			marquee[3] = [viewpoint.x, viewpoint.y, 0]
      			marquee[2] = [marquee[1].x, marquee[3].y, 0]
      			marquee[4] = [marquee[3].x, marquee[1].y, 0]
      			gw.settransform(viewport.gettm())
      			gw.wpolyline marquee true
      			gw.enlargeupdaterect #whole
      			gw.updatescreen()
      		)
      	)
      

The completeredraw in there slows things down quite a lot – is there possibly a way to clear the previously created polylines yet still retain the geometry underneath so the user can see what they are marquee’ing? I tried a few methods – I suppose I could just keep the ghosting lines there and just clean them up after the tool ends.