SketchUcation Plugin Store

 

 

Reverse operation of view.screen_coords

Reverse operation of view.screen_coords

Postby jpark » Fri Mar 30, 2012 8:33 am

How do you get 3-dimensional points @ each view.corners? Like an opposite method of view.screen_coords.

I am trying to automatically pan one screen at a time in x or y direction while in top view of a model (sort of like microfiche machine used to read newspaper articles in olden days!!!).

I figure adjusting camera eye and target position by model width/height displayed on screen should accomplish this; but I can't seemed to find the method to do this. Is this possible?

Sincerely,

John
jpark
 
Posts: 10
Joined: Sun Feb 27, 2011 1:29 am

Re: Reverse operation of view.screen_coords

Postby TIG » Fri Mar 30, 2012 9:47 am

If you get the view.camera, get its .eye and .target and change these points 'in tandem', then apply them to a new/updated camera etc then the view should 'pan'...
[I put that very simplistically but you ought to get the idea]
So with eye.x=eye.x+10 and target.x=target.x+10 ... it should pan the camera by 10 to the right etc...
TIG
User avatar
TIG
Global Moderator
 
Posts: 14016
Joined: Mon Nov 12, 2007 7:24 pm
Location: Northumbria UK
Name: TIG
Operating system: Windows
SketchUp version: 2013
License type: Pro
SketchUp use: architecture
Level of SketchUp: Advanced

Re: Reverse operation of view.screen_coords

Postby thomthom » Fri Mar 30, 2012 9:48 am

Code: Select all
ray = view.pickray( x, y )
result = model.raytest( ray ) 


?

But, may I ask why you want to perform such pan?
Thomas Thomassen — SketchUp Monkey & Coding addict
List of my plugins and link to the CookieWare fund
User avatar
thomthom
Global Moderator
 
Posts: 17687
Joined: Tue Nov 13, 2007 12:47 pm
Location: Trondheim, Norway
Name: thomthom
Operating system: Windows
SketchUp version: 8
License type: Pro
SketchUp use: architecture
Level of SketchUp: Advanced

Re: Reverse operation of view.screen_coords

Postby thomthom » Fri Mar 30, 2012 9:49 am

TIG wrote:If you get the view.camera, get its .eye and .target and change these points 'in tandem', then apply them to a new/updated camera etc then the view should 'pan'...
[I put that very simplistically but you ought to get the idea]
So with eye.x=eye.x+10 and target.x=target.x+10 ... it should pan the camera by 10 to the right etc...

He's trying to figure out how much he has to move the camera in order for it to shift by the size of the viewport.
Thomas Thomassen — SketchUp Monkey & Coding addict
List of my plugins and link to the CookieWare fund
User avatar
thomthom
Global Moderator
 
Posts: 17687
Joined: Tue Nov 13, 2007 12:47 pm
Location: Trondheim, Norway
Name: thomthom
Operating system: Windows
SketchUp version: 8
License type: Pro
SketchUp use: architecture
Level of SketchUp: Advanced

Re: Reverse operation of view.screen_coords

Postby TIG » Fri Mar 30, 2012 9:55 am

TIG
User avatar
TIG
Global Moderator
 
Posts: 14016
Joined: Mon Nov 12, 2007 7:24 pm
Location: Northumbria UK
Name: TIG
Operating system: Windows
SketchUp version: 2013
License type: Pro
SketchUp use: architecture
Level of SketchUp: Advanced

Re: Reverse operation of view.screen_coords

Postby thomthom » Fri Mar 30, 2012 10:00 am


Doesn't that risk it snapping to nearby geometry? That's why I was thinking a raytest would be safest as it would not be affected by inference.
Thomas Thomassen — SketchUp Monkey & Coding addict
List of my plugins and link to the CookieWare fund
User avatar
thomthom
Global Moderator
 
Posts: 17687
Joined: Tue Nov 13, 2007 12:47 pm
Location: Trondheim, Norway
Name: thomthom
Operating system: Windows
SketchUp version: 8
License type: Pro
SketchUp use: architecture
Level of SketchUp: Advanced

Re: Reverse operation of view.screen_coords

Postby TIG » Fri Mar 30, 2012 10:12 am

He can specify the view's inputpoint by using screen-coordinates (x,y) ?
And then get the inputpoint's position as a 3dPoint ??

That way he can get the screen width as with y at 0, and x at 0 and screen-width, gives two points - he can get the distance between them, then that's the amount to shunt the camera's eye/target across to pan a whole screen in the x-direction ?
TIG
User avatar
TIG
Global Moderator
 
Posts: 14016
Joined: Mon Nov 12, 2007 7:24 pm
Location: Northumbria UK
Name: TIG
Operating system: Windows
SketchUp version: 2013
License type: Pro
SketchUp use: architecture
Level of SketchUp: Advanced

Re: Reverse operation of view.screen_coords

Postby TIG » Fri Mar 30, 2012 10:28 am

This 'proof of concept' pans the whole screen to the right [in plan is easiest to see...]
Code: Select all
def pan_whole_screen_to_the_right()
  model=Sketchup.active_model
  view=model.active_view
  ip0=view.inputpoint(0,0)
  ip1=view.inputpoint(view.vpwidth,0)
  p0=ip0.position
  p1=ip1.position
  dis=p0.distance(p1)
  cam=view.camera
  eye=cam.eye
  tar=cam.target
  upp=cam.up
  eye.x=eye.x+dis
  tar.x=tar.x+dis
  cam.set(eye,tar,upp)
end
Obviously you can make a more flexible method which could pan right/left and up/down as desired...
TIG
User avatar
TIG
Global Moderator
 
Posts: 14016
Joined: Mon Nov 12, 2007 7:24 pm
Location: Northumbria UK
Name: TIG
Operating system: Windows
SketchUp version: 2013
License type: Pro
SketchUp use: architecture
Level of SketchUp: Advanced

Re: Reverse operation of view.screen_coords

Postby thomthom » Fri Mar 30, 2012 11:14 am

TIG wrote:He can specify the view's inputpoint by using screen-coordinates (x,y) ?
And then get the inputpoint's position as a 3dPoint ??

But my concern was that InputPoint will return a 3D point affected by inference, ie it snaps to mid points or something, based onthe 2D point.
Thomas Thomassen — SketchUp Monkey & Coding addict
List of my plugins and link to the CookieWare fund
User avatar
thomthom
Global Moderator
 
Posts: 17687
Joined: Tue Nov 13, 2007 12:47 pm
Location: Trondheim, Norway
Name: thomthom
Operating system: Windows
SketchUp version: 8
License type: Pro
SketchUp use: architecture
Level of SketchUp: Advanced

Re: Reverse operation of view.screen_coords

Postby TIG » Fri Mar 30, 2012 11:49 am

I see the point. :roll:
Here's a fuller version that avoids that [can you think of a better way?]
Code: Select all
def pan_whole_screen_to_the_right()
  model=Sketchup.active_model
  ents=model.entities
  ants=model.active_entities
  pants=ents.to_a+ants.to_a
  hidn=pants.uniq.find_all{|e|not e.hidden?}
  model.start_operation('pants')
  hidn.each{|e|e.hidden=true}
  hgeo=model.rendering_options["DrawHidden"]
  model.rendering_options["DrawHidden"]=false
  view=model.active_view
  ip0=view.inputpoint(0,0)
  ip1=view.inputpoint(view.vpwidth,0)
  p0=ip0.position
  p1=ip1.position
  dis=p0.distance(p1)
  cam=view.camera
  eye=cam.eye
  tar=cam.target
  upp=cam.up
  eye.x=eye.x+dis
  tar.x=tar.x+dis
  cam.set(eye,tar,upp)
  hidn.each{|e|e.hidden=false}
  model.rendering_options["DrawHidden"]=hgeo
  model.commit_operation
end
TIG
User avatar
TIG
Global Moderator
 
Posts: 14016
Joined: Mon Nov 12, 2007 7:24 pm
Location: Northumbria UK
Name: TIG
Operating system: Windows
SketchUp version: 2013
License type: Pro
SketchUp use: architecture
Level of SketchUp: Advanced

Re: Reverse operation of view.screen_coords

Postby thomthom » Fri Mar 30, 2012 12:08 pm

TIG wrote:Here's a fuller version that avoids that [can you think of a better way?] [code]def pan_whole_screen_to_the_right()

viewtopic.php?f=180&t=44290#p394956
Thomas Thomassen — SketchUp Monkey & Coding addict
List of my plugins and link to the CookieWare fund
User avatar
thomthom
Global Moderator
 
Posts: 17687
Joined: Tue Nov 13, 2007 12:47 pm
Location: Trondheim, Norway
Name: thomthom
Operating system: Windows
SketchUp version: 8
License type: Pro
SketchUp use: architecture
Level of SketchUp: Advanced

Re: Reverse operation of view.screen_coords

Postby TIG » Fri Mar 30, 2012 12:54 pm

Therefore we can substitute
p0=view.pickray(0,0)[0]
p1=view.pickray(view.vpwidth,0)[0]

and get a simpler method because the ray's point doesn't get influenced by inferences and is made on the picture-plane, as it were...
Code: Select all
def pan_whole_screen_to_the_right()
  model=Sketchup.active_model
  view=model.active_view
  p0=view.pickray(0,0)[0]
  p1=view.pickray(view.vpwidth,0)[0]
  dis=p0.distance(p1)
  cam=view.camera
  eye=cam.eye
  tar=cam.target
  upp=cam.up
  eye.x=eye.x+dis
  tar.x=tar.x+dis
  cam.set(eye,tar,upp)
end
:)
TIG
User avatar
TIG
Global Moderator
 
Posts: 14016
Joined: Mon Nov 12, 2007 7:24 pm
Location: Northumbria UK
Name: TIG
Operating system: Windows
SketchUp version: 2013
License type: Pro
SketchUp use: architecture
Level of SketchUp: Advanced

Re: Reverse operation of view.screen_coords

Postby thomthom » Fri Mar 30, 2012 12:57 pm

Ah, yes! Of course - no need to pick anything. I forgot that the ray contained a point that could be used directly.
Thomas Thomassen — SketchUp Monkey & Coding addict
List of my plugins and link to the CookieWare fund
User avatar
thomthom
Global Moderator
 
Posts: 17687
Joined: Tue Nov 13, 2007 12:47 pm
Location: Trondheim, Norway
Name: thomthom
Operating system: Windows
SketchUp version: 8
License type: Pro
SketchUp use: architecture
Level of SketchUp: Advanced

Re: Reverse operation of view.screen_coords

Postby TIG » Fri Mar 30, 2012 1:03 pm

Two brains are better than one [at least our combined IQs add up to around the average!!]
:lol:
TIG
User avatar
TIG
Global Moderator
 
Posts: 14016
Joined: Mon Nov 12, 2007 7:24 pm
Location: Northumbria UK
Name: TIG
Operating system: Windows
SketchUp version: 2013
License type: Pro
SketchUp use: architecture
Level of SketchUp: Advanced

Re: Reverse operation of view.screen_coords

Postby thomthom » Fri Mar 30, 2012 1:15 pm

I've already determined that my brain is on timeshare lease... :roll:
Thomas Thomassen — SketchUp Monkey & Coding addict
List of my plugins and link to the CookieWare fund
User avatar
thomthom
Global Moderator
 
Posts: 17687
Joined: Tue Nov 13, 2007 12:47 pm
Location: Trondheim, Norway
Name: thomthom
Operating system: Windows
SketchUp version: 8
License type: Pro
SketchUp use: architecture
Level of SketchUp: Advanced

Re: Reverse operation of view.screen_coords

Postby jpark » Fri Mar 30, 2012 3:48 pm

TIG and thomthom,

Do you guys ever sleep!!??
You gave me a plenty of assignment for the weekend; to digest all that you posted.

For your info, I am attempting to model a 'plan viewer' for blueprints which will become framework for architectural components

Thanks guys

John
jpark
 
Posts: 10
Joined: Sun Feb 27, 2011 1:29 am

Re: Reverse operation of view.screen_coords

Postby thomthom » Fri Mar 30, 2012 4:22 pm

"Sl-eep"..? :?
Thomas Thomassen — SketchUp Monkey & Coding addict
List of my plugins and link to the CookieWare fund
User avatar
thomthom
Global Moderator
 
Posts: 17687
Joined: Tue Nov 13, 2007 12:47 pm
Location: Trondheim, Norway
Name: thomthom
Operating system: Windows
SketchUp version: 8
License type: Pro
SketchUp use: architecture
Level of SketchUp: Advanced

Re: Reverse operation of view.screen_coords

Postby jpark » Fri Mar 30, 2012 7:50 pm

Just finished reading up on view.pickray method and ran TIG's sample code. At first glance it should have worked but does not. In executing each line, I find that p0 and p1 return same value as camera eye position. See Ruby Console responses below:

p0=view.pickray(0,0)[0]
Point3d(3255.11, 1479.16, 8761.61)
p1=view.pickray(view.vpwidth,0)[0]
Point3d(3255.11, 1479.16, 8761.61)
p2=view.pickray(0,view.vpheight)[0]
Point3d(3255.11, 1479.16, 8761.61)
p3=view.pickray(view.vpwidth,view.vpheight)[0]
Point3d(3255.11, 1479.16, 8761.61)
cam=Sketchup.active_model.active_view.camera
#<Sketchup::Camera:0x7ce5de0>
cam.eye
Point3d(3255.11, 1479.16, 8761.61)
cam.target
Point3d(3255.11, 1479.16, 127.281)
cam.up
Vector3d(0, 1, 0)


How could this be? I thought I understood pickray method but NOT

Off the topic note: where can I find instruction on how to annotate posting w/ codes, images, smiles, etc ...

John
jpark
 
Posts: 10
Joined: Sun Feb 27, 2011 1:29 am

Re: Reverse operation of view.screen_coords

Postby TIG » Fri Mar 30, 2012 8:18 pm

I added some 'ruby' tags to make it clearer...

I hope this is not ALL of the code...
Have you set the view and so on earlier ?
IF so... you don't use
cam=Sketchup.active_model.active_view.camera
but
cam=view.camera
???
My code is a working example.......
TIG
User avatar
TIG
Global Moderator
 
Posts: 14016
Joined: Mon Nov 12, 2007 7:24 pm
Location: Northumbria UK
Name: TIG
Operating system: Windows
SketchUp version: 2013
License type: Pro
SketchUp use: architecture
Level of SketchUp: Advanced

Re: Reverse operation of view.screen_coords

Postby Dan Rathbun » Fri Mar 30, 2012 8:37 pm

jpark wrote:Off the topic note: where can I find instruction on how to annotate posting w/ codes, images, smiles, etc ...

There is a "hard to find" link on each message "POST A REPLY" page, in the right column, beneath the "Smilies" list.

Notice how the line "BBCode is ON" has a link ??

It leads you to a user guide for the code tags.

Most of these usable tags have toolbar button "inserters" already set up for you to use. You just click the button, it inserts the tag. and positions the cursor between the tags so you can type text (or paste text,) into them.
User avatar
Dan Rathbun
Top SketchUcator
 
Posts: 4102
Joined: Tue Oct 06, 2009 3:06 am
Location: Florida, USA
Name: Dan Rathbun
Operating system: Windows
SketchUp version: 2013
License type: Pro
SketchUp use: education
Level of SketchUp: Advanced

Re: Reverse operation of view.screen_coords

Postby jpark » Fri Mar 30, 2012 9:35 pm

Dan Rathbun wrote:There is a "hard to find" link on each message "POST A REPLY" page, in the right column, beneath the "Smilies" list.

Now I'm enlightened :ecstatic: Thanks Dan

TIG wrote:I hope this is not ALL of the code...

No this is an output of individual Ruby Console execution. This is my attempt to debug each line of your sample code to check each variable's current value. Programming is my hobby and I just picked up Sketchup and Ruby couple of months ago so I have a lot to learn.

Back to pickray method - All screen postions (ie p0, p1, p2, and p3) return different value yet pickray method of these points return identical 3D point as camera eye position but with different vector. How come?

John
jpark
 
Posts: 10
Joined: Sun Feb 27, 2011 1:29 am

Re: Reverse operation of view.screen_coords

Postby thomthom » Sat Mar 31, 2012 1:20 am

eh.. TIG, I think we both did a brain-fart. We have to do a raytest - otherwise the ray will return a point which is based on the camera eye... because all pickray origin from the camera eye.
Thomas Thomassen — SketchUp Monkey & Coding addict
List of my plugins and link to the CookieWare fund
User avatar
thomthom
Global Moderator
 
Posts: 17687
Joined: Tue Nov 13, 2007 12:47 pm
Location: Trondheim, Norway
Name: thomthom
Operating system: Windows
SketchUp version: 8
License type: Pro
SketchUp use: architecture
Level of SketchUp: Advanced

Re: Reverse operation of view.screen_coords

Postby thomthom » Sat Mar 31, 2012 1:21 am

Though, at 2:30 it's hard to process these thigns...
Thomas Thomassen — SketchUp Monkey & Coding addict
List of my plugins and link to the CookieWare fund
User avatar
thomthom
Global Moderator
 
Posts: 17687
Joined: Tue Nov 13, 2007 12:47 pm
Location: Trondheim, Norway
Name: thomthom
Operating system: Windows
SketchUp version: 8
License type: Pro
SketchUp use: architecture
Level of SketchUp: Advanced

Re: Reverse operation of view.screen_coords

Postby TIG » Sat Mar 31, 2012 11:50 am

Here's a much better version that uses planes, lines, vectors, and takes arguments to change panning from right/left and up/down etc - allowing a toolbar button set to be easily made...
Code: Select all
require 'sketchup.rb'
### Usage TIG.screenpan(1), where the argument can be either 1, -1, 2 or -2
### 1=right, -1=left, 2=up, -2=down
### make 4 'arrow' buttons in a toolbar using the 4 alternative commands.
module TIG
    def self.screenpan(direction=1)
        m = Sketchup.active_model
        v = m.active_view
        c0 = v.corner(0)
        c1 = v.corner(1)
        c2 = v.corner(2)
        c = v.camera
        e = c.eye
        t = c.target
        up = c.up
        di = c.direction
        pa = [e, di]
        i0 = v.inputpoint(c0[0],c0[1]).position
        i1 = v.inputpoint(c1[0],c1[1]).position
        i2 = v.inputpoint(c2[0],c2[1]).position
        p0 = Geom.intersect_line_plane([i0,di], pa)
        p1 = Geom.intersect_line_plane([i1,di], pa)
        p2 = Geom.intersect_line_plane([i2,di], pa)
        vx = p0.vector_to(p1)
        vy = p0.vector_to(p2)
        case direction
          when 1
            c.set(e.offset(vx), t.offset(vx), up)
          when -1
            c.set(e.offset(vx.reverse), t.offset(vx.reverse), up)
          when 2
            c.set(e.offset(vy.reverse), t.offset(vy.reverse), up)
          when -2
            c.set(e.offset(vy), t.offset(vy), up)
       end
    end
end
TIG
User avatar
TIG
Global Moderator
 
Posts: 14016
Joined: Mon Nov 12, 2007 7:24 pm
Location: Northumbria UK
Name: TIG
Operating system: Windows
SketchUp version: 2013
License type: Pro
SketchUp use: architecture
Level of SketchUp: Advanced

Re: Reverse operation of view.screen_coords

Postby jpark » Sat Mar 31, 2012 9:16 pm

TIG,

It works great and I actually understood your program steps. Now I need to dig into reference material to create tool bars.

Thanks for your help

John
jpark
 
Posts: 10
Joined: Sun Feb 27, 2011 1:29 am

Re: Reverse operation of view.screen_coords

Postby TIG » Sat Mar 31, 2012 10:19 pm

Insert this whole block of code inside the mIN 'module' near the beginning - between
module TIG
and
def self.screenpan(direction=1)
Then put the whole of the code in a file called 'TIG-screenpan.rb' in the Plugins folder and restart...
Put your buttons icon .PNG files inside a subfolder in Plugins called 'TIG-screenpan'.
Name then as shown, for small/large icons, for each of the 4 buttons, 8 PNGs in all...
This is the menu code...
Code: Select all
### menu
unless file_loaded?(File.basename(__FILE__))
  cmd1=UI::Command.new('TIG.screenpan_RIGHT'){self.screenpan(1)}
  cmd1.tooltip=('TIG.screenpan_RIGHT')
  cmd1.status_bar_text=('TIG.screenpan_RIGHT: Pan RIGHT..')
  cmd1.small_icon=File.join('TIG-screenpan', 'pan1-16.png')
  cmd1.large_icon=File.join('TIG-screenpan', 'pan1-24.png')
  cmd_1=UI::Command.new('TIG.screenpan_LEFT'){self.screenpan(-1)}
  cmd_1.tooltip=('TIG.screenpan_LEFT')
  cmd_1.status_bar_text=('TIG.screenpan_LEFT: Pan LEFT..')
  cmd_1.small_icon=File.join('TIG-screenpan', 'pan_1-16.png')
  cmd_1.large_icon=File.join('TIG-screenpan', 'pan_1-24.png')
  cmd2=UI::Command.new('TIG.screenpan_UP'){self.screenpan(2)}
  cmd2.tooltip=('TIG.screenpan_UP')
  cmd2.status_bar_text=('TIG.screenpan_UP: Pan UP..')
  cmd2.small_icon=File.join('TIG-screenpan', 'pan2-16.png')
  cmd2.large_icon=File.join('TIG-screenpan', 'pan2-24.png')
  cmd_2=UI::Command.new('TIG.screenpan_DOWN'){self.screenpan(-2)}
  cmd_2.tooltip=('TIG.screenpan_DOWN')
  cmd_2.status_bar_text=('TIG.screenpan_DOWN: Pan DOWN..')
  cmd_2.small_icon=File.join('TIG-screenpan', 'pan_2-16.png')
  cmd_2.large_icon=File.join('TIG-screenpan', 'pan_2-24.png')
  ###
  toolbar=UI::Toolbar.new('TIG.screenpan')
  toolbar.restore if toolbar.get_last_state==TB_VISIBLE
  toolbar.add_item(cmd1)
  toolbar.add_item(cmd_1)
  toolbar.add_item(cmd2)
  toolbar.add_item(cmd_2)
  sub=UI.menu('Tools').add_submenu("TIG.Screenpan...")
  sub.add_item(cmd1)
  sub.add_item(cmd_1)
  sub.add_item(cmd2)
  sub.add_item(cmd_2)
end
file_loaded(File.basename(__FILE__))
###
[UNTESTED!]
TIG
User avatar
TIG
Global Moderator
 
Posts: 14016
Joined: Mon Nov 12, 2007 7:24 pm
Location: Northumbria UK
Name: TIG
Operating system: Windows
SketchUp version: 2013
License type: Pro
SketchUp use: architecture
Level of SketchUp: Advanced

Re: Reverse operation of view.screen_coords

Postby jpark » Sun Apr 01, 2012 4:46 am

TIG

Once again, I thank you for your generous assistance :!: :D

With 1 minor correction, this is working as intended.
sub=UI.menu('Tools').add_item("TIG.Screenpan...")

Changed add_item to add_submenu

This is the only line of code I did not fully understand
unless file_loaded?(File.basename(__FILE__))

I know this is to make sure the plugin load once, but can you explain 'basename(__FILE__)'?

Moving onto to my next challenge, what method do I need to look at in order to display an area of image whose vertices are known (sort of like zoom window without maually selecting zoom area)

John
jpark
 
Posts: 10
Joined: Sun Feb 27, 2011 1:29 am

Re: Reverse operation of view.screen_coords

Postby TIG » Sun Apr 01, 2012 10:14 am

Again.... untested stupid typo ! :roll:
Sorry!
add_item adds a command directly to that menu
sub=...add_submenu adds a 'submenu' to that menu,
in which you can then use add_item...
I changed original in case others copy it... :?

The system variable __FILE__ gives the full-path of each loading .rb script [fails if compiled as a .rbs!].
There are many 'File' methods, so if it is say
'C:/Program Files/Google/Google SketchUp 8/Plugins/xxx.rb'
File.basename(__FILE__) >>> 'xxx.rb'
and also
File.basename(__FILE__, '.*') >>> 'xxx'
File.extname(__FILE__) >>> '.rb'
File.dirname(__FILE__) >>> 'C:/Program Files/Google/Google SketchUp 8/Plugins'
etc etc...
Of course you can use it with and string that is a 'file-path' - like you'd get from an 'open' dialog etc...

I'll sleep on your last question...
TIG
User avatar
TIG
Global Moderator
 
Posts: 14016
Joined: Mon Nov 12, 2007 7:24 pm
Location: Northumbria UK
Name: TIG
Operating system: Windows
SketchUp version: 2013
License type: Pro
SketchUp use: architecture
Level of SketchUp: Advanced

SketchUcation One-Liner Adverts

by Ad Machine » 5 minutes ago

Vertex Tools for SketchUp. Take control over each vertex with this vertex editor for SketchUp.

Premium Members get 20% discount!

Ad Machine
Robot
 
Posts: 2012


Return to Developers' Forum

Who is online

Users browsing this forum: ammo111, tictactoe and 5 guests