sketchucation logo sketchucation
    • Login
    1. Home
    2. piratebrian
    3. Posts
    โ„น๏ธ Licensed Extensions | FredoBatch, ElevationProfile, FredoSketch, LayOps, MatSim and Pic2Shape will require license from Sept 1st More Info
    Offline
    • Profile
    • Following 0
    • Followers 0
    • Topics 8
    • Posts 19
    • Groups 1

    Posts

    Recent Best Controversial
    • Automatic finger joint CNC cut path tool

      I just finished a first draft of a Dynamic Component CNC cut layout tool for woodworking finger joints.

      https://3dwarehouse.sketchup.com/model.html?id=ub39eed16-01b5-41c3-afb8-f941ad57737d%26amp;msg=Success!%20Your%20model%20has%20been%20uploaded.%20Please%20note%20that%20it%20can%20take%20a%20minute%20or%20so%20before%20your%20model%20appears%20in%20search%20results%20and/or%20on%20your%20My%203D%20Warehouse%20page.
      It can be found on the 3d warehouse under the name: "Finger Joint dynamic component with cnc cut paths V2 DRAFT"

      User inputs are:
      board width
      number of fingers/teeth
      tolerance of fit
      (.002" for hammer tight, .009" fit with glue, or use about .004 for tight fit)
      The spacing is auto calculated using this data.

      As this is a first draft, I don't have the board thickness and finger length co-joined -please just explode and stretch as needed until I can get back to rebuilding the formulas. But the annoying spacing work along one axis is done at least ๐Ÿ˜• Also bit diameter is set at 1/8" I use an Onsrund 2 flute, straight for this kind of work with max pass depth at .070" at 180ipm in finish plywood.
      To use, click into one of the two components until all the joint get blue-boxed, right click and select dynamic component -options. input board width, number of fingers, and tolerance of fit.


      finger joint pic.JPG

      posted in Woodworking
      piratebrianP
      piratebrian
    • RE: The "Duh!" thread (aka the Doh! thread)

      When taking one surface and copy pasting it into an unrelated group, if you click on the destination surface before you do the control-v paste you newly placed surface will auto align. Found this one by accident, it is probably page 2 of the instructions, But bahhh instructions.

      posted in SketchUp Discussions
      piratebrianP
      piratebrian
    • RE: Sketchup To CNC Routering

      I draw a rough rectangle push/puled to its actual material thickness (down to 0.002") then component each part. one copy of the part can sit flat and get auto-updated as you work on the assembled view. Working on the copies of the parts assembled allows you to see every intersection easily. The ones flat on the xy axis are ready for my 3axis cnc for export. Keeping everything in the same file, I hide every other part except the one I need to the cnc via dxf to Thermwood CAM. http://sketchucation.com/forums/viewtopic.php?f=183%26amp;t=51468
      In my guide I wrote I cover just about everything you need to do to bring 2d sketchup dxf to a format that can be easily machined with another CAM program. It explains how to deal with segmented curves, what plugins to use for welding curves, making higher rez text shapes etc.

      posted in Woodworking
      piratebrianP
      piratebrian
    • 3d printed robot parrot

      Here is a robot that I printed using Sketchup.
      Youtube link:
      https://www.youtube.com/watch?feature=player_embedded%26amp;v=NPAw_5zL6-A

      parrotgif.gif

      The parrot was printed on an Afinia 5x5x5" bed mostly out of ABS.
      I traced some profile and front view pictures of parrots. The 3d warehouse had some, but none that I liked. I was attempting to go along the methods used in that great Youtube video: Artisan SketchUp Tutorial: Part 1 I ended up not doing any of that and just started to play with the triangle meshes. Does anyone know what the Plugin is that allows you to grab onto a vertex?
      shape.JPG
      Using the zero thin surface triangular shells I placed downloaded servos from the 3d warehouse, modified to my servo dimensions. I placed the servos inside the shape where I thought it needed pivots and where the essential actuation needs to be to match those goofy goofy birds. For the insides, the 3d printed parts just needed to either hold a servo, or mount onto the servo's arm. So designing parts to jump from servo to the next was fairly easy once the servo positions seemed right.
      arm holder.JPG
      Three plugins that were essential was the .STL export, Fredo's Junction push-pull, and TIG's Smart Offset plugin. After the thin membrane triangulated shape was good and adjusted to fit all the servos even when they move. I used the Junction Push Pull plugin to turn that thin triangulated framework into a thickened shell so there was something of thickness to actually print. In areas where I wanted a triangular open frame look, I used the Tig-smart-offset tool before Junction push-pull tool. That is how I got the open-frame skin look. I had a some lengths of 1/16" brass wire and a selection of both 6-32 screws and 2-56 nuts and bolts to solve problems that glue alone could not fix. To get the 6-32 screws to both act as free moving pivots and tight screw-down connections I printed out a trial and error template with multiple different sized holes to see which one corresponded to a 6-32 screw free fit and a self-threading hole with my preferred printer layer thickness settings.
      test hole.JPG

      The selected diameter circles were then used throughout the assembly via auto component updating. Each of the 15 parts used these components for nearly all the assembly methods. Overall the project took one month of free time including the Sketchup tasks, servo install, and adjusting the Arduiono code for the new body.

      Friends don't let Friends print ABS in enclosed rooms.

      posted in SketchUp for 3D Printing sketchup
      piratebrianP
      piratebrian
    • RE: Sketchup Helix Threads first try garden hose fitting

      I just found a better (?) method of drawing threads by a guy called Andy Sutardy.

      His steps actually used no plugins which was amazing.
      They were:
      make a circle of 24 segments
      explode circle
      lift one segments at random angle.
      delete rest
      copy rotate 23 times, making 24 total one segment of a helix layer,
      copy lift 23 times so the lower one then connects to its neighbor above.
      he then had a segmented helix coil 24 coils all 24 segments.
      exploded, selected one helix, deleted rest.
      scaled it down to be one complete helical revolution, did the measurement to get the lengh per unit thread 1/TPI height.
      drew a cylinder of 24 segements, placed the stacked revolving helix on the cylinder of equal diameter.
      Made one helix be the valley one be the peak,
      scalled peak helix to stretch the thread from the surface of the cylinder.

      Come to think of it. He could then math scaled the helix to get it to scale to a particular dimension after drawing it also. By hiding the hidden surface contours, and selecting one helix or the other, the individual scaling of the outer and inner helix could take place.

      My method lacks as much elegance, but requires less steps. His method is far less cleanup. unhappy with both.

      @cotty said:

      See here: http://www.finewoodworking.com/item/112614/screw-threads-in-sketchup (DaveR)

      posted in SketchUp for 3D Printing
      piratebrianP
      piratebrian
    • Sketchup Helix Threads first try garden hose fitting

      I just finished with (a first draft) of true helix thread garden hose fitting. Does anyone have a better method than what I employed to make the threads?
      The 3d warehouse model is clean for export to a 3d printer, and contains crude step by step text instructions on methods and plugins used:
      picture of threads

      Link Preview Image
      3D Warehouse

      3D Warehouse is a website of searchable, pre-made 3D models that works seamlessly with SketchUp.

      favicon

      (3dwarehouse.sketchup.com)

      It is of the US garden hose with 11.5 threads per inch at 1.044 OD, 0.967 ID inches. I have yet to test it out with abs on my 3d printer. It is not for actual use.
      garden hose thread file
      Thanks also for your wisdom
      PB

      posted in SketchUp for 3D Printing sketchup
      piratebrianP
      piratebrian
    • RE: Plugin for 3D shapes fabrication from plywood

      I am just learning more complex sketchup drawing methods but here is how I made these objects:
      Fredo6 bezierspline(plugin in italics)
      -drew 6 or so f-splines, made some duplicates and scaled/stretched the duplicates.
      -Grouped each line
      Fredo6 bezier tools

      • clicked into the curves one at a time and selected all, bz-convert to, polyline
      • BZ-Convert to, polyline segmentor (select how many segments you want, I used 50 segments for the ones near the ceiling, the more dramatic profiles I used 100)
        Group each profile line.
        Curviloft plugin,
        -it meshed all the curves together.
        DRAPE TOOL or just draw a box, group it, move it so the sides intersect. Explode, triple click (select all lines and surfaces) right click context menu, intersect all.
        clean up edges and delete any excess.
        Slicer (by TIG)
        play with this tool you have lots of awesome options. remember that rgb=xyz for when you choose along which axis you want to slice along.

      For making the file cutable by CNC, grab the curves produced by slicer and use Fredo's Beziersplineplugin to convert those low-rez lines to catmull splines.


      plywood contour v1.JPG


      plywood contour rough v2.JPG


      v8 contour example.skp

      posted in Woodworking
      piratebrianP
      piratebrian
    • Coral pattern question- which plugin would work?

      Hey Awesome people,
      I want to make a coral type structure suitable to my 3d printer. I would like to get some plugin recommendations and or rough procedures. I can draw this,su coral.JPG but I would like the radius of the edge to expand to follow the size available to the surface they are placed. Any ideas? I know it is achievable in Rhino, thanks ahead of time! -Brian


      coral.JPG

      posted in Plugins
      piratebrianP
      piratebrian
    • RE: SketchUp to CNC CAM software guide

      Hey jjenks2006
      Sorry I just saw your question. You probably have solved the problem by now. Most of my parts I send to my Thermwood control nesting on the machine have multiple layers extending up into the z axis simply because it allows me to side view all the parts and quick administer the bulk layer naming by window selecting. As bmcintosh mentioned each part has it's outer edge as "outline z0p471" In Sketchup, as long as the camera is on parallel projection and the top view is selected everything exported as a 3d file type dxf out of sketchUp pro comes up as normal cut path individually nestable parts. An outline layer on a 3d dxf part should only be the bottom (or top) face outer edges viewable from top view (blue axis on). I'll have to take a look at that Mosaic Sketchup interface program. You can send a 61.998 by 120.998 dxf to the machine and have it placed on a 62" by 121" table and material so long as the long side of the form is along the x axis and the collar and part clearances are at 0.001. Being able to edit all the part collar and part spacing clearances on the control nesting software on the machine I find easier. This is due to cut problems that can arise on a large job where one warped material/bad drawing can crop up. Being able to quickly identify the bad parts that need re-cut or redrawn and re-nested as additions to the remainder of the 20 sheet job is quite easy with this method. Often on a 10-30 sheet job 3-4 parts need recut/redrawn by the time I reach sheet 7. Que-ing them up for the next sheet is easy so long as 1. you know what you cut (see the printout option on control nesting for a running list of all the parts cut on each material sheet) 2. total of what you want (already listed on the file import of dxf screen). 3. what and how many parts need re-cut. Any re-drawing activity and control nesting them can be done outside of the super controller's activities running the g-code. Going back to cad every time will be tough as it requires a separate inventory scenario.

      posted in Woodworking
      piratebrianP
      piratebrian
    • RE: Not sure why my dc does this axis

      Thanks pcmoor

      posted in Dynamic Components
      piratebrianP
      piratebrian
    • Not sure why my dc does this axis

      I am new at drawing parametric deign equation based shapes so bare with me. My file (attached) shows the double nested component array of a simple object. To the left is the raw array, middle is the array rotated up, to the far right the array is shown falling apart once the dc is refreshed. Hidden to the right is text of exactly how I made the parametric shape. When I group the entire thing, and rotate it. The x y axis equations defining the position of the DC's seem to half reference the primary drawing axis and not the axis that travels within the group. The result is the items are placed to the old axis, while maintaining their original orientation. Am I doing something wrong (in 1,000 words or less ๐Ÿ˜‰ I made some primitive work arounds to get what I wanted shown. Thanks ahead of time.
      Brian


      a basic parametric design

      posted in Dynamic Components sketchup
      piratebrianP
      piratebrian
    • RE: 3 AxisThermwood CNC router miter cuts

      I just updated this file to include all miter angle cuts between 30 degrees and 166 degrees.

      The new link is below:
      http://sketchup.google.com/3dwarehouse/details?mid=4984de825c7932eb73ac8f193878e4bc&prevstart=0

      Description of downloadable file:
      This model contains multiple layer names and lines representing the cut path of a 3/8" ball end mill along the edge of a part of thickness 0.499 inches. It allows carpentry joints at all angles between 30 and 166 (as measured through the acute angle of the matching faces) An example of the application is in the file and shows how to use the pre-grouped angle patterns. The angle patterns show their z azis placement. Steps: 1 measure part angle, 2 select angle, 3 move and place as shown in example, 4 stretch the grouped miter angle pattern so it goes slightly ( 1/2" diameter of 3/8" bit) of part. The layer name convention is directly compatible with Thermwood Control Nesting Software driven machines with 0.375 being end mill and 0.374 being ball end mill in tool setup. The angle patterns are grouped and inter-related through the sketchup component feature (change one line name, and all other cut paths for all other angles auto-update) There is an additional 3/8" end mill clean up pass for steep angle miters greater than 102 degrees. The drawing of the ball end mill and end mill bit was done by others (as noted).


      pic.JPG

      posted in Woodworking
      piratebrianP
      piratebrian
    • RE: Ruby script of bezier curves need edit

      I'll post some cut tests shortly, but here is the lovely curve:


      bezier 160.JPG

      posted in Developers' Forum
      piratebrianP
      piratebrian
    • RE: Ruby script of bezier curves need edit

      Awesome Dan!
      Thanks, I'll try it.
      I'll read up on the Newbie's guide as well.

      posted in Developers' Forum
      piratebrianP
      piratebrian
    • SketchUp to CNC CAM software guide

      Here is a guide for using SketchUp with CNC dxf to g code software.
      Recent updates:
      -deleted useless information.

      This guide is applicable to situations where you want to use Sketchup with CAM software that generates g-code off of .dxf file formats. I assume you are using Sketchup as your primary part generation workspace. It was written based on experience with a 3 axis Thermwood CNC router. With those CNC machines, you can export a .dxf directly to the machine control cabinet where g code is generated with auto written tool changes, nesting, flip operations, sheet changes, pop up pins and other efficiency lending features.

      Cautionary note:

      All of this information is based on internet research, testing, my version of software, and my general ignorance; which are all important factors in its accuracy and error. Using these techniques I have made over 700 different parts in 2 1/2 years, with most pencil drawing to router cut times of about 2-3 hours for complex text cut outs and 5-10 min for simple shape forms. Real testing with your particular situation and ample professional caution is the only way to avoid injury to yourself and your machine. The obvious is obvious but problems with drawings are not.

      Outline:
      SKETCHUP TO THERMWOOD CNC (or sketchup to dxf/g-code converting program) .
      CARVING TEXT, TEXT SHAPES
      LINES
      DRILL HOLES
      CIRCLES
      ARCS
      BEZIER SPLINES
      POLYGON
      DXF EXPORT TIPS
      DXF DRAWING CHECKING TIPS
      CUTTING TECHNIQUES FOR COMPLEX OR SMALL PARTS ON A VACUUM TABLE
      WORKSPACE AND EFFICIENCY TIPS
      SKECHUP PLUGINS
      ..
      ADOBE ILLUSTRAITOR TO SKETCHUP TO CNC VIA .DXF FILES
      SKETCHUP TO MASTERCAM TO CNC VIA .IGES FILES

      ##############
      SketchUp Pro--->.dxf --> Thermwod CNC These techniques work for a Thermwood Qcore supercontroller and probably for other CAM software packages but obvious testing is needed.

      CARVING TEXT, TEXT SHAPES_____________________________________________
      To load new fonts into Sketchup: Download a TTF. (True Type Font) font from the web, in the windows file folder (see web for location of this folder on your system) right click context menu and select install. Next time you select a font in sketchup, it will appear in the sketchup list. It uses the same font folder as the rest of the computer. Only True-Type Fonts.

      To get single line fonts:
      Here are some True Type Fonts that I use for on-part labeling in Sketchup/CNC and some basic fast signage around the shop.
      http://www.mrrace.com/CamBam_Fonts/
      I mostly have to manually draw them over imported fonts due to many rare fonts that get sent to me, especially if my text is below 1 inch height.

      To increase segment count in a curve to make it smoother cutting on machine and image better:
      BZ_toolbar plugin.
      https://extensions.sketchup.com/en/content/bezier-curve-tool
      Select segments or curve, right click to get to the BZ-CONVERT in the context, CONVERT TO CATMULL SPLINE. The curve will turn high resolution (100-400 line segments) This technique also works for cleaning up bad Illustrator fonts. This technique works for single curves but not around intentionally tight corners like in the letter "D" You will have to select only the curves your want smoother, not the intersecting desirably flat lines. To get the line segment back down to something reasonable for small things, see tip below. Generally speaking, depending on your G-Code tangency factors ( for thermwood CNC: GG09f8, to G09f15) smooth cutting means the machine doesn't ramp down in speed and ramp up when it comes to light to moderate changes in angle between lines.

      To reduce high element count load times:
      Explode curves.
      Use Plugin Curvizard, Make Curves (Weld) to combine a large number count segment curve. This pre-organizes the lines in the file so the CAM software doesn't have to work so hard.

      To go from high segment count curves to low segment count curves.
      This is often the case when you have to reduce a bezier curve at 600 segments that is a mere 1" long to something more reasonable.
      Plugin: BZ_Toolbar
      Click curve, right click for BZ_Convert to, Polyline Segmentor for Animation.
      This will give you criteria to choose how the line is chopped. Select Max of .04"
      You can also use BZ_Convert To, polyline divider. I use this one for contours to make rectangular mesh surfaces.

      To increase line segment count in fonts and smooth in Adobe Illustrator:
      Note: Most CNC cam allows you to directly import from illustrator. This tip is to aid if you need to do some work/joints/hole locations etc.
      In Illustrator: (This is a modified procedure from http://sketchucation.com/forums/viewtopic.php?f=15%26amp;t=6675)

      1. First go to object-path-simplify measure. Make sure straight lines starts off unchecked
      2. Select all
      3. Go to Type-Create Outline
      4. Select all
      5. Go go Object โ€“ Path โ€“add anchor points
        Do step #5 multiple times to divide and subdivide the curves. For 3โ€ text = 4 repeats of step #5, For 10โ€ tall text needs about 6 or 8 repeats of step #5.
      6. Select all
      7. Object-Path-Simplify check the straight lines box, make sure angle threshold is at 0
      8. Export dxf
        This should bring into Sketch up pro a very dense drawing with many many line segments. The curves will come out well. Remember that line segments below 0.060 inch cut smoothly and 0.100 segmented curve lengths tend not to dependent on some machine acceleration settings.

      To outline complex curves so to use a center-line to command a bit around:
      Plugin: Tig-Smart-offset (a far more intelligent offsetting tool, it works 90% of the time, but like the native outline tool it can not offset a series of lines that has a .005" rats nest sitting in one corner of an otherwise fine seeming drawing)
      http://sketchucation.com/forums/viewtopic.php?t=49624
      To command the machine to do exactly the type of pass you want use the "centerline d0p### z0p###" layer applied to a offset line.

      LINES-
      A line carries both its layer name and the layer name of the group of entities it has been grouped together with. As grouping together lines is essential to SU drawings, keep all your group names on layer zero.

      To organize complex cut paths you can lift them up into the z axis, it is ignored on dxf export because it only looks at the xy to get it's cut information. For 3d carved surfaces exported out of sketchup into programs like MasterCam, see below.

      DRILL HOLES โ€“
      At least on Thermwood Machines, if there are lines among a DXF circle on the "Drill z0p###" layer it will correctly self pocket and carve using smaller bits for larger cut holes.
      -Draw the desired radius circle off part in open space somewhere, layer name it, Drill z0p486 (example), group it, component it, then move it into position on the desired surface. Copy paste as needed across part making multiple holes. Keeping drill holes as components helps tremendously to change drill diameter changes across large projects.

      • Remember that if you hover over an edge of the circle, the auto snap will activate the center of the circle.
      • A circle drawn in Sketchup Pro will export as a true DXF equation of a circle so long as it is NOT stretched or exploded or drawn in such a way that one of its edges touches a geometry (the native auto- weld feature of Sketchup is annoying in this one regard).

      CIRCLES-
      -Advanced circle tools are available from other plugins. This advice is for the native shape generation:

      • A circle exported with Sketchup Pro as a .dxf export as true equations of a circle and so will cut as an equation in the G-code. The circle can intersect other geometry making it a curve of constant radius (see arcs below).
        -Right after you select to draw a circle, the number of segments desired will be in the lower left of the screen. If you plan on keeping the circle intact (not scaling, or making it intersect a line) this can be ignored. This value will be remembered and come up as a changeable default every time you draw a circle.
        -you can change the resolution of the circle by simply clicking ENTITY INFO.
        -If you plan on stretching a circle into an ellipse start with a high enough segment count.
      • You can increase the circlesโ€™ segments until the individual segment length is low (0.06), then explode. The resulting high number of segments in the shape of a circle (100 for about 3โ€ diameter, 600 for about 30โ€ diameter) will cut smoothly with little distortion.

      ARCS-
      See the section above on carving text on how to modify an already drawn and exploded arc to increase its line segments or other such operations necessary for smooth carving on the CNC.

      • Arcs as simply drawn in Sketchupโ€™s abbreviated polygon fashion will leave a large segmented appearance and will cut on the machine that way unless you change the arc segments. In SU when you first use the arc tool, a segment number option is available.

      • The Didier Bur Arc Circles plugin has a center and 2 point selection tool that works quite well for when you are compounding centerline moves among bits. i.e. in a tight corner where you want a 0.125" dia bit to follow the outer cut path left by a 0.375 bit, the 0.125" bit will need a radius specific arc in the tight corner (0.375/2)-(0.125/2) = radius of arc.

      BEZIER SPLINES-
      -Fredo6 BEZIER plugin is amazing and youtube videos can be seen to illustrate its use.
      -Basically with this plugin you can take any jumble of lines, turn them into a polyline, and smooth them out along various mathematical curve fits of either the same number of elements or an increased number of segments.
      -The Bezier curve function native to Sketchup, like circles, has a number of segments option right when you select the tool. 3-400 element Bezier curves that exist as 2foot long curves seem to cut well.

      POLYGONS-
      -If the polygon draw tool is used to draw a triangle early in a drawing must be exploded after you are happy with the segment count. Explode these types of shapes as they do not export well.

      DXF EXPORT TIPS:
      -Export dxf only with top view, camera parallel projection mode. ALWAYS (sorry for the caps but yeaโ€ฆ) All parts on x,y plane clearly separated for easy hide, unhide for individual part export.
      -Always have the layer list open, and the layer name selection box on the toolbar available. Cycle through individual layer names to hide them to check to see that you have given all the cut paths the correct layer name and thereby cut depth and tool.

      • To export a single part that shares the workspace with all the other parts of the assembly, hide, make hidden hot keys to toggle between parts prior to exporting the dxf. I hide all, then unhide one part at a time, zoom extents, then export. This has the following advantages to workflow: the zoom extents checks for window problems of stray lines/unhidden undesired parts, as each part is exported separately, it gives you a pause to name the parts. Each part gets its own exported name for use by the nesting software and essential for troubleshooting.
        -When exporting .dxf using the SketchUp Pro export option found under File -->Export -->3d model. Entities, surfaces, and their layer names are exported using only the 3d export option, the 2d export option does unknown things.
        -Groups have a layer name just like lines do. This can lead to confusion among some CAM software packages. Keep groups on layer zero, entities inside the groups at their correct respective g-code specific actions.
        -The non-global xyzaxis that exists within a group is ignored. The larger axis is used as the part reference axis for the file export is the one seen by the machine. If you loose track of the proper global axis orientation, click on axis, reset or simply cut and paste a cube from a fresh file and match the axis to that.
        -In sketchup lines can be hidden in visible groups but visible lines can not be seen in hidden groups.
        -Global Axis color code RGB=xyz
        -You can have both the disassembled or cut path view and the assembled object on the same Sketchup drawing. It requires that each part of the assembly be a grouped component. This is useful. This is particularity useful for complex joints were adjustments are made on the assembly, and the flattened parts auto-update and are easy to export.

      SKETCHUP DRAWING CHECKING SUGGESTIONS_______________________________________
      -Use the offset tool on any chain of entities you want to check for 1. Consistency, 2. Connection, and 3. Stray lines that intersect the loop that shouldnโ€™t. The offset tool will fail on any shape that has stray single lines jutting out at an edge. This is useful as a check for instances where the machine does not accept a dxf when there is spotty geometry on the critical outline layer entities.
      -Use the layer visibility to check that proper layer names are applied to the right entities. Again, groups should always be called Layer 0 so the entities within can be tested using this method.
      -Use the fact that S.U. auto surfaces any looped line segments to check for a tiny break in a surface by subdividing by crossed lines, the open spaces will point the part of the geometry with problems. There is a plugin for this, I can't remember what it is.
      -Using the styles, architect view for a drawing allows you to see segment ends easier.
      -If a stubborn file refuses to import and the shape is dramatic, take the 2d shape, push pull it. This will reveal errors in lines. If that doesn't indicate the problem you can also take a large rectangle and intersect it with the push pulled form, making a self-healing continuous loop.
      -if you need a way to get a side of a shape to lay flat, use the unfold plugin tool, or there is a way to apply the rotate tool (not the group move handle plus marks) to any axis. There are tutorials on this on the web.

      SUGGESTIONS FOR CUTTING OF SMALL PARTS OR COMPLEX PARTS ON A VACUUM TABLE:
      -UL MDF โ€“Clean edges, 0.375 helix rough leaving 0.015 on walls and 0.025 on floor, 0.25 straight single flute finish pass and freeing part pass makes a nice looking circular saw quality clean edge.
      -UL MDF tiny parts (smallest I have ever cut was 1โ€x1โ€ square out of 0.75 thick porus LDF on a vacuum table) All cuts done down to 0.030 skin, final part free cut done with 0.125 two flute straight bit as the cutting forces are very low.
      -For Finish laminate or finish sanded Maple board. All penetrating passes with 0.375 helix up cut are preceded by a 0.125 2 flute straight pass at 0.035 depth. The tiny 1/ 8โ€ bit has next to no cutting forces to tear or rip up the material so using it first on outer part edges is great. This method works for all laminates where tear out is a concern typically a compression bit would work well but a chip clearance pass seems out of the question.
      -Large parts, thin picture frame: Partial cut down to .035 throughout all of shape (inside and outside). Cut outside first then inside.
      -Small parts, thin picture frame: Cut inside free, then outside.
      -Long thin parts, select cut order so last pass along a line cuts part free from the larger uncut mass.

      Open frames on vacuum tables where there is next to no surface area to hold parts. Cut order that works well:

      1. All non-penetrating surface detail (dados, blind holes, text carve etc)
      2. All inside features down to 0.035
      3. All outside loops down to 0.025
      4. All through holes to table
      5. All inside loops to table
      6. All outside loops to table. (part is free)

      WORK SPACE AND EFFICIENCY SUGGESTIONS__________________________________
      Have the following toolbars visible: (go to view, toolbars to activate)
      -edit, fredo6 tools, layers, measurements, principal, bz_toolbar, views, Tig.smart offset, round corner
      Have the layers list open, keep layer 0 as your active layer, check mark hidden layers as needed
      Keep your non-mouse using hand on the keyboard and make shortcuts for all the keys it can reach easily. So one hand is the drawing input, and the other is the task/operation input. As your non-mouse hand learns the keys you will be able to draw like a Boss!
      The following hotkeys work for a left hand on the keyboard (go to model, preferences, shortcuts to program them in by typing in the search term, then pressing the key and clicking on the plus symbol to add it)
      c for draw/shapes/circle
      h for view/hidden geometry
      k for view/edge style/back edges
      w for camera/zoom extents
      f2 for tools/push/pull
      f3 for tools/rotate
      f5 for tools/scale
      f6 for tools/offset
      f7 for file/export 3d model (dxf option that is best for exporting to cnc software)
      a for draw/arc
      b for draw/bezier curve
      -Use camera, parallel projection mode when drawing as it helps in showing what the top view (along blue axis looking down to xy red/green) contains.
      -Depending on your drawing style, I find it easiest to work with 'Layer 0' as the active layer and draw everything at one layer 0, then selectively apply layer names to very specific lines to title the cut paths.

      IMPORTANT SKETCHUP PLUGINS
      DIDIER BUR ARC CIRCLES plugin - for some nice arc tools that solves some situations that the native arc and circle tools do not have or are awkward to use.
      There are more to be found on line, but here are my favorite and most used:
      FREDO6 BEZIER SPLINE (Amazing Illustrator level curve line management tools including the BZ-convert to Catmull spline and the polyline segmentor increase tool, provides the opposite to explode curve)
      ROUND CORNER (makes square edges round)
      SELECTION TOY (can select a large network of lines or faces)
      TIG SMART OUTLINE (smart offset line tool, can do multiple shapes at once so that one cutpath can be distributed among many parts at once)
      EXPORT STL (good for 3d printing and export to mastercam)
      EXPORT IGES (good for exporting 3d carving surfaces to mastercam)

      For more complex 3d sculpting:
      Slicer (good for aircraft style frame design and building)
      CURVILOFT (drafts 3d skins between multiple shapes with a selection of math curve fit profiles)
      FREDO6 JOINT PUSH PULL ( Allows shell creation and complex TIN manipulation)
      FREDO6 FREDO SCALE (Allows scaling skews, sheer shifts, 3d part twisting/licorice twists of shapes, and full shape bends)

      ##########################
      Adobe Illustrator --> Sketchup --> Thermwood CNC router
      Most CAM takes Illustrator files directly. I use this procedure for text importing of Adobe Illustraitor into Sketch Up to make densely segmented curves for smooth CNC cutting.

      In Illustrator: (This is a modified procedure from http://sketchucation.com/forums/viewtopic.php?f=15%26amp;t=6675) We are going to add anchor points, then simply them

      1. First verify a check marked box is unchecked: object-path-simplify measure Make sure straight lines starts off unchecked
      2. Select all
      3. Go to Type-Create Outline
      4. Select all
      5. Go go Object โ€“ Path โ€“add anchor points
        Do step #5 multiple times for 3โ€ text = 4 repeats of step #5, For 10โ€ tall text needs about 6 or 8 repeats of step #5). Do more of these as needed to increase the segments aka reduce segment size so the cnc machine can interpolate between the points.
      6. Select all
      7. Object-Path-Simplify check the straight lines box, use the slider bar, make sure angle threshold is at 0 check your to see it worked.
      8. Export dxf

      This should bring into Sketch up pro a very dense drawing with many many line segments. The downside of this is that Text fonts with very simple lines have hundreds, but curves come out well. Remember that line segments below 0.060 inch cut smoothly and 0.100 segmented curve lengths tend not to.

      #######################
      SketchUp --->.iges-->Mastercam
      For 3d carved surfaces
      Procedure:
      Mastercam skips the .dxf drawing gcode processing on the Thermwood router console and instead, drops g-code direct to the machine.

      In SketchUp: (not sure if Pro is required for this?)
      Explode all surfaces, no groups, no reversed surfaces (in SketchUp vew style should be default to see reversed surfaces as blue), no surfaces inside shapes, no stray non-surfaced lines hanging out. Any drills should be unexploded circles extruded into material with no tops.
      standard axis orientation with big parts setting with their long axis on the x axis (10 foot tables).
      To make it easy on the offsets to keep track of, place the part as if it is on a table where 0,0,0 on screen= the cnc table 0,0,0. See the Thermwood CNC manual for details on the table size.
      You can export more than one part from S.U to Mastercam at a time, as long as they are on same xy plane.
      Using the SketchUp export with tools-'IGES EXPORT' plugin:
      iges_export V0.7
      http://sketchucation.com/forums/viewtopic.php?t=43307
      it will produce a file without a .type naming convention, open the folder where it is located and manually rename it with a โ€œ.igesโ€ ending.
      In Mastercam:
      -open up Mastercam normally,
      file, file merge pattern, (select your newly renamed ###.iges file)
      Pop up: "Scale current part to metric?" -no
      Alt-f8, at bottom "current:" select default from pull down, it will "scale current part to english" -yes The part should appear, check to see that the origin is correct. Check the dims of the part by going to stock setup and select bounding box. The origin that appears on the screen will be the default machine table origin unless offsets are applied in mastercam or at the machine offset table at the cnc console.
      Here the curved (albeit) polygon meshes import as carvable surfaces by any of the many 3d contour, rough, finish and high speed toolpaths.

      For future shapes where you like the same cut paths but need them applied to a different geometry you can save as, delete all the geometry on the screen (your cut paths will get red error symbols) Then file, file merge pattern, follow the earlier steps for bringing in a geometry(this allows the lifting of already developed cut paths to transfer to a new part if you already have some cut paths on your screen that you like the settings on)
      Notes:
      -The rough or finish contour cut path is useful for basic quick machining.
      Mastercam is its own creature of a program. The Solids feature that it comes with is not necessary. Post-processor written by someone with experience is. If you need some tips on how Mastercam works it is tough to find this info for free. Books with examples are the cheapest and being a student somewhere helps with access to the 6 mo. cheap version.

      End


      Shape examples and and some layer names

      posted in Woodworking
      piratebrianP
      piratebrian
    • RE: 3 AxisThermwood CNC router miter cuts

      Hey Scott M
      Sorry I just saw you post from 2010.

      To do a dxf drawing to the Thermwood machine follow the following rules:

      -Use sketchUp Pro
      -raw circles as drawn export as true circles in a dxf so long as they are not grouped under a layer name active on the thermwood, and not scaled or otherwise tweeked or exploded.
      -Drill layer naming convention "drill z0p250" drills a 0.250 deep hole using a 1/4" dia mill bit, or if you only have a 1/8" diameter bit, it will use it so long as in the tool menue in control nesting the bit is permitted to interpolate that large a diameter.

      posted in Woodworking
      piratebrianP
      piratebrian
    • RE: CAM / CNC ?

      For 3d Carving, I am using the following process:
      SketchUp Pro ---> (export as IGES using IGES plugin) ---> MasterCam. --> Thermwood CNC
      For 2d Cutting with drawing based control of cutting depths and tool use:
      SketchUp Pro --> (export dxf) ---> Thermwood CNC
      Thermwood CNC's can accept DXF drawings where the drawing layer tells the G-code generator what to do.

      I wrote a Sketchup guide for my specific Thermwood CNC. Some information is applicable to other CNC's.
      http://sketchucation.com/forums/viewtopic.php?f=183&t=51468
      I hope it is of some help to people trying to navigate the software end of cnc machines.

      posted in SketchUp Discussions
      piratebrianP
      piratebrian
    • Ruby script of bezier curves need edit

      I operate a CNC machine and use SketchUp-Pro as the primary CAD for the machine. I want the bezier curve ruby script to make curves with more than 20 segments. The CNC machine will cut the curve in a smooth contour so long as the segment length is quite small but with this script draws always with 20 segments.

      I have tried to edit the ruby script, changing all references to the number 10 or the number 20 to a higher number re-saved and ran it, with no effect.
      What needs changed in the original ruby script to make this happen?

      I appreciate assistance in this matter.

      Below is the raw ruby script code as downloaded from http://www.sketchup.com/download/rubyscripts.html: (under the heading bezier.rb)

      <span class="syntaxdefault"></span><span class="syntaxcomment">#&nbsp;Copyright&nbsp;2004-2005,&nbsp;@Last&nbsp;Software,&nbsp;Inc.<br /><br />#&nbsp;This&nbsp;software&nbsp;is&nbsp;provided&nbsp;as&nbsp;an&nbsp;example&nbsp;of&nbsp;using&nbsp;the&nbsp;Ruby&nbsp;interface<br />#&nbsp;to&nbsp;SketchUp.<br /><br />#&nbsp;Permission&nbsp;to&nbsp;use,&nbsp;copy,&nbsp;modify,&nbsp;and&nbsp;distribute&nbsp;this&nbsp;software&nbsp;for&nbsp;<br />#&nbsp;any&nbsp;purpose&nbsp;and&nbsp;without&nbsp;fee&nbsp;is&nbsp;hereby&nbsp;granted,&nbsp;provided&nbsp;that&nbsp;the&nbsp;above<br />#&nbsp;copyright&nbsp;notice&nbsp;appear&nbsp;in&nbsp;all&nbsp;copies.<br /><br />#&nbsp;THIS&nbsp;SOFTWARE&nbsp;IS&nbsp;PROVIDED&nbsp;"AS&nbsp;IS"&nbsp;AND&nbsp;WITHOUT&nbsp;ANY&nbsp;EXPRESS&nbsp;OR<br />#&nbsp;IMPLIED&nbsp;WARRANTIES,&nbsp;INCLUDING,&nbsp;WITHOUT&nbsp;LIMITATION,&nbsp;THE&nbsp;IMPLIED<br />#&nbsp;WARRANTIES&nbsp;OF&nbsp;MERCHANTABILITY&nbsp;AND&nbsp;FITNESS&nbsp;FOR&nbsp;A&nbsp;PARTICULAR&nbsp;PURPOSE.<br />#-----------------------------------------------------------------------------<br />#&nbsp;Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;&nbsp;&nbsp;Bezier&nbsp;Curve&nbsp;Tool&nbsp;1.0<br />#&nbsp;Description&nbsp;;&nbsp;&nbsp;&nbsp;A&nbsp;tool&nbsp;to&nbsp;create&nbsp;Bezier&nbsp;curves.<br />#&nbsp;Menu&nbsp;Item&nbsp;&nbsp;&nbsp;;&nbsp;&nbsp;&nbsp;Draw->Bezier&nbsp;Curves<br />#&nbsp;Context&nbsp;Menu;&nbsp;&nbsp;&nbsp;Edit&nbsp;Bezier&nbsp;Curve<br />#&nbsp;Usage&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;&nbsp;&nbsp;Select&nbsp;4&nbsp;points-<br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;&nbsp;&nbsp;1.&nbsp;Start&nbsp;point&nbsp;of&nbsp;the&nbsp;curve<br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;&nbsp;&nbsp;2.&nbsp;Endpoint&nbsp;of&nbsp;the&nbsp;curve<br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;&nbsp;&nbsp;3.&nbsp;Second&nbsp;control&nbsp;point.&nbsp;&nbsp;It&nbsp;determines&nbsp;the&nbsp;tangency&nbsp;at&nbsp;the&nbsp;start<br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;&nbsp;&nbsp;4.&nbsp;Next&nbsp;to&nbsp;last&nbsp;control&nbsp;point.&nbsp;&nbsp;It&nbsp;determines&nbsp;the&nbsp;tangency&nbsp;at&nbsp;the&nbsp;end<br />#&nbsp;Date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;&nbsp;&nbsp;8/26/2004<br />#&nbsp;Type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;&nbsp;&nbsp;Tool<br />#-----------------------------------------------------------------------------<br /><br />#&nbsp;Ruby&nbsp;implementation&nbsp;of&nbsp;Bezier&nbsp;curves<br /></span><span class="syntaxkeyword">require&nbsp;</span><span class="syntaxstring">'sketchup.rb'<br /><br /></span><span class="syntaxdefault">module&nbsp;Bezier<br /><br /></span><span class="syntaxcomment">#&nbsp;Evaluate&nbsp;a&nbsp;Bezier&nbsp;curve&nbsp;at&nbsp;a&nbsp;parameter.<br />#&nbsp;The&nbsp;curve&nbsp;is&nbsp;defined&nbsp;by&nbsp;an&nbsp;array&nbsp;of&nbsp;its&nbsp;control&nbsp;points.<br />#&nbsp;The&nbsp;parameter&nbsp;ranges&nbsp;from&nbsp;0&nbsp;to&nbsp;1<br />#&nbsp;This&nbsp;is&nbsp;based&nbsp;on&nbsp;the&nbsp;technique&nbsp;described&nbsp;in&nbsp;"CAGD&nbsp;&nbsp;A&nbsp;Practical&nbsp;Guide,&nbsp;4th&nbsp;Editoin"<br />#&nbsp;by&nbsp;Gerald&nbsp;Farin.&nbsp;page&nbsp;60<br /><br /></span><span class="syntaxdefault">def&nbsp;Bezier</span><span class="syntaxkeyword">.eval(</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">t</span><span class="syntaxkeyword">)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">degree&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">length&nbsp;</span><span class="syntaxkeyword">-&nbsp;</span><span class="syntaxdefault">1<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">if&nbsp;</span><span class="syntaxdefault">degree&nbsp;</span><span class="syntaxkeyword"><&nbsp;</span><span class="syntaxdefault">1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">return&nbsp;</span><span class="syntaxdefault">nil<br />&nbsp;&nbsp;&nbsp;&nbsp;end<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;t1&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">1.0&nbsp;</span><span class="syntaxkeyword">-&nbsp;</span><span class="syntaxdefault">t<br />&nbsp;&nbsp;&nbsp;&nbsp;fact&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">1.0<br />&nbsp;&nbsp;&nbsp;&nbsp;n_choose_i&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">1<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">].</span><span class="syntaxdefault">x&nbsp;</span><span class="syntaxkeyword">*&nbsp;</span><span class="syntaxdefault">t1<br />&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">].</span><span class="syntaxdefault">y&nbsp;</span><span class="syntaxkeyword">*&nbsp;</span><span class="syntaxdefault">t1<br />&nbsp;&nbsp;&nbsp;&nbsp;z&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">].</span><span class="syntaxdefault">z&nbsp;</span><span class="syntaxkeyword">*&nbsp;</span><span class="syntaxdefault">t1<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">for&nbsp;</span><span class="syntaxdefault">i&nbsp;in&nbsp;1.</span><span class="syntaxkeyword">..</span><span class="syntaxdefault">degree<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fact&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">fact</span><span class="syntaxkeyword">*</span><span class="syntaxdefault">t<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n_choose_i&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">n_choose_i</span><span class="syntaxkeyword">*(</span><span class="syntaxdefault">degree</span><span class="syntaxkeyword">-</span><span class="syntaxdefault">i</span><span class="syntaxkeyword">+</span><span class="syntaxdefault">1</span><span class="syntaxkeyword">)/</span><span class="syntaxdefault">i<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fn&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">fact&nbsp;</span><span class="syntaxkeyword">*&nbsp;</span><span class="syntaxdefault">n_choose_i<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;</span><span class="syntaxkeyword">=&nbsp;(</span><span class="syntaxdefault">x&nbsp;</span><span class="syntaxkeyword">+&nbsp;</span><span class="syntaxdefault">fn</span><span class="syntaxkeyword">*</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">i</span><span class="syntaxkeyword">].</span><span class="syntaxdefault">x</span><span class="syntaxkeyword">)&nbsp;*&nbsp;</span><span class="syntaxdefault">t1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;</span><span class="syntaxkeyword">=&nbsp;(</span><span class="syntaxdefault">y&nbsp;</span><span class="syntaxkeyword">+&nbsp;</span><span class="syntaxdefault">fn</span><span class="syntaxkeyword">*</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">i</span><span class="syntaxkeyword">].</span><span class="syntaxdefault">y</span><span class="syntaxkeyword">)&nbsp;*&nbsp;</span><span class="syntaxdefault">t1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;z&nbsp;</span><span class="syntaxkeyword">=&nbsp;(</span><span class="syntaxdefault">z&nbsp;</span><span class="syntaxkeyword">+&nbsp;</span><span class="syntaxdefault">fn</span><span class="syntaxkeyword">*</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">i</span><span class="syntaxkeyword">].</span><span class="syntaxdefault">z</span><span class="syntaxkeyword">)&nbsp;*&nbsp;</span><span class="syntaxdefault">t1<br />&nbsp;&nbsp;&nbsp;&nbsp;end<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">x&nbsp;</span><span class="syntaxkeyword">+&nbsp;</span><span class="syntaxdefault">fact</span><span class="syntaxkeyword">*</span><span class="syntaxdefault">t</span><span class="syntaxkeyword">*</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">degree</span><span class="syntaxkeyword">].</span><span class="syntaxdefault">x<br />&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">y&nbsp;</span><span class="syntaxkeyword">+&nbsp;</span><span class="syntaxdefault">fact</span><span class="syntaxkeyword">*</span><span class="syntaxdefault">t</span><span class="syntaxkeyword">*</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">degree</span><span class="syntaxkeyword">].</span><span class="syntaxdefault">y<br />&nbsp;&nbsp;&nbsp;&nbsp;z&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">z&nbsp;</span><span class="syntaxkeyword">+&nbsp;</span><span class="syntaxdefault">fact</span><span class="syntaxkeyword">*</span><span class="syntaxdefault">t</span><span class="syntaxkeyword">*</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">degree</span><span class="syntaxkeyword">].</span><span class="syntaxdefault">z<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Geom</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">Point3d</span><span class="syntaxkeyword">.new(</span><span class="syntaxdefault">x</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">y</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">z</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span class="syntaxdefault">end&nbsp;</span><span class="syntaxcomment">#&nbsp;method&nbsp;eval<br /><br />#&nbsp;Evaluate&nbsp;the&nbsp;curve&nbsp;at&nbsp;a&nbsp;number&nbsp;of&nbsp;points&nbsp;and&nbsp;return&nbsp;the&nbsp;points&nbsp;in&nbsp;an&nbsp;array<br /></span><span class="syntaxdefault">def&nbsp;Bezier</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">points</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">numpts</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">curvepts&nbsp;</span><span class="syntaxkeyword">=&nbsp;[]<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">dt&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">1.0&nbsp;</span><span class="syntaxkeyword">/&nbsp;</span><span class="syntaxdefault">numpts<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxcomment">#&nbsp;evaluate&nbsp;the&nbsp;points&nbsp;on&nbsp;the&nbsp;curve<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">for&nbsp;</span><span class="syntaxdefault">i&nbsp;in&nbsp;0.</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">numpts<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">i&nbsp;</span><span class="syntaxkeyword">*&nbsp;</span><span class="syntaxdefault">dt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curvepts</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">i</span><span class="syntaxkeyword">]&nbsp;=&nbsp;</span><span class="syntaxdefault">Bezier</span><span class="syntaxkeyword">.eval(</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">t</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">end<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;curvepts<br />end<br /><br /></span><span class="syntaxcomment">#&nbsp;Create&nbsp;a&nbsp;Bezier&nbsp;curve&nbsp;in&nbsp;SketchUp<br /></span><span class="syntaxdefault">def&nbsp;Bezier</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">curve</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">numseg&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">16</span><span class="syntaxkeyword">)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">model&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">Sketchup</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">active_model<br />&nbsp;&nbsp;&nbsp;&nbsp;entities&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">model</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">active_entities<br />&nbsp;&nbsp;&nbsp;&nbsp;model</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">start_operation&nbsp;</span><span class="syntaxstring">"Bezier&nbsp;Curve"<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">curvepts&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">Bezier</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">points</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">numseg</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxcomment">#&nbsp;create&nbsp;the&nbsp;curve<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">edges&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">entities</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">add_curve</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">curvepts</span><span class="syntaxkeyword">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">model</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">commit_operation<br />&nbsp;&nbsp;&nbsp;&nbsp;edges<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />end<br /><br /></span><span class="syntaxcomment">#-----------------------------------------------------------------------------<br />#&nbsp;Define&nbsp;the&nbsp;tool&nbsp;class&nbsp;for&nbsp;creating&nbsp;Bezier&nbsp;curves<br /><br /></span><span class="syntaxkeyword">class&nbsp;</span><span class="syntaxdefault">BezierTool<br /><br />def&nbsp;initialize</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">degree&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">3</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;@</span><span class="syntaxdefault">degree&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">degree<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">if(&nbsp;@</span><span class="syntaxdefault">degree&nbsp;</span><span class="syntaxkeyword"><&nbsp;</span><span class="syntaxdefault">1&nbsp;</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">UI</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">messagebox&nbsp;</span><span class="syntaxstring">"Minimum&nbsp;degree&nbsp;is&nbsp;1"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">degree&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">1<br />&nbsp;&nbsp;&nbsp;&nbsp;elsif</span><span class="syntaxkeyword">(&nbsp;@</span><span class="syntaxdefault">degree&nbsp;</span><span class="syntaxkeyword">>&nbsp;</span><span class="syntaxdefault">20&nbsp;</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">UI</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">messagebox&nbsp;</span><span class="syntaxstring">"Maximum&nbsp;degree&nbsp;is&nbsp;20"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">degree&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">20<br />&nbsp;&nbsp;&nbsp;&nbsp;end<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxcomment">#&nbsp;TODO;&nbsp;I&nbsp;should&nbsp;probably&nbsp;adjust&nbsp;the&nbsp;number&nbsp;of&nbsp;segments&nbsp;used&nbsp;for<br />&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;display&nbsp;and&nbsp;creating&nbsp;the&nbsp;curve&nbsp;based&nbsp;on&nbsp;the&nbsp;the&nbsp;degree&nbsp;and/or&nbsp;the<br />&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;maximum&nbsp;curvature.<br /></span><span class="syntaxdefault">end<br /><br />def&nbsp;reset<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">pts&nbsp;</span><span class="syntaxkeyword">=&nbsp;[]<br />&nbsp;&nbsp;&nbsp;&nbsp;@</span><span class="syntaxdefault">state&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">0<br />&nbsp;&nbsp;&nbsp;&nbsp;Sketchup</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">set_status_text&nbsp;</span><span class="syntaxstring">"Click&nbsp;for&nbsp;start&nbsp;point"<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">drawn&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">false<br />end<br /><br />def&nbsp;activate<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxcomment">#&nbsp;There&nbsp;are&nbsp;up&nbsp;to&nbsp;4&nbsp;input&nbsp;points&nbsp;that&nbsp;we&nbsp;keep&nbsp;track&nbsp;of<br />&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;@ip1&nbsp;is&nbsp;the&nbsp;start&nbsp;point&nbsp;of&nbsp;the&nbsp;curve<br />&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;@ip2&nbsp;is&nbsp;the&nbsp;endpoint&nbsp;of&nbsp;the&nbsp;curve<br />&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;@ip3&nbsp;is&nbsp;the&nbsp;second&nbsp;control&nbsp;point.&nbsp;&nbsp;It&nbsp;determines&nbsp;the&nbsp;tangency&nbsp;at&nbsp;the&nbsp;start<br />&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;@ip4&nbsp;is&nbsp;the&nbsp;next&nbsp;to&nbsp;last&nbsp;control&nbsp;point.&nbsp;&nbsp;It&nbsp;determines&nbsp;the&nbsp;tangency&nbsp;at&nbsp;the&nbsp;end<br />&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;@ip5&nbsp;is&nbsp;an&nbsp;internal&nbsp;input&nbsp;point<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">ip1&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">Sketchup</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">InputPoint</span><span class="syntaxkeyword">.new<br />&nbsp;&nbsp;&nbsp;&nbsp;@</span><span class="syntaxdefault">ip2&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">Sketchup</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">InputPoint</span><span class="syntaxkeyword">.new<br />&nbsp;&nbsp;&nbsp;&nbsp;@</span><span class="syntaxdefault">ip3&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">Sketchup</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">InputPoint</span><span class="syntaxkeyword">.new<br />&nbsp;&nbsp;&nbsp;&nbsp;@</span><span class="syntaxdefault">ip4&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">Sketchup</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">InputPoint</span><span class="syntaxkeyword">.new<br />&nbsp;&nbsp;&nbsp;&nbsp;@</span><span class="syntaxdefault">ip5&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">Sketchup</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">InputPoint</span><span class="syntaxkeyword">.new<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxcomment">#&nbsp;@ip&nbsp;is&nbsp;a&nbsp;temporary&nbsp;input&nbsp;point&nbsp;used&nbsp;to&nbsp;get&nbsp;other&nbsp;positions<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">ip&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">Sketchup</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">InputPoint</span><span class="syntaxkeyword">.new<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">reset<br />&nbsp;&nbsp;&nbsp;&nbsp;Sketchup</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">set_status_text&nbsp;</span><span class="syntaxstring">"Degree"</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">SB_VCB_LABEL<br />&nbsp;&nbsp;&nbsp;&nbsp;Sketchup</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">set_status_text&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">degree</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">SB_VCB_VALUE<br />end<br /><br />def&nbsp;deactivate</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">invalidate&nbsp;</span><span class="syntaxkeyword">if&nbsp;@</span><span class="syntaxdefault">drawn<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">ip1&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">nil<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">ip2&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">nil<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">ip3&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">nil<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">ip4&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">nil<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">ip5&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">nil<br />end<br /><br />def&nbsp;onMouseMove</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">flags</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">x</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">y</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;@</span><span class="syntaxdefault">state<br />&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;0&nbsp;</span><span class="syntaxcomment">#&nbsp;getting&nbsp;the&nbsp;first&nbsp;end&nbsp;point<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">ip</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">pick&nbsp;view</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">x</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">y<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">if(&nbsp;@</span><span class="syntaxdefault">ip</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">valid</span><span class="syntaxkeyword">?&nbsp;&&&nbsp;@</span><span class="syntaxdefault">ip&nbsp;</span><span class="syntaxkeyword">!=&nbsp;@</span><span class="syntaxdefault">ip1&nbsp;</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@</span><span class="syntaxdefault">ip1</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">copy</span><span class="syntaxkeyword">!&nbsp;@</span><span class="syntaxdefault">ip<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">invalidate<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;1&nbsp;</span><span class="syntaxcomment">#&nbsp;getting&nbsp;the&nbsp;second&nbsp;end&nbsp;point<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">ip</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">pick&nbsp;view</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">x</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">y</span><span class="syntaxkeyword">,&nbsp;@</span><span class="syntaxdefault">ip1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">if(&nbsp;@</span><span class="syntaxdefault">ip</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">valid</span><span class="syntaxkeyword">?&nbsp;&&&nbsp;@</span><span class="syntaxdefault">ip&nbsp;</span><span class="syntaxkeyword">!=&nbsp;@</span><span class="syntaxdefault">ip2&nbsp;</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@</span><span class="syntaxdefault">ip2</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">copy</span><span class="syntaxkeyword">!&nbsp;@</span><span class="syntaxdefault">ip<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">1</span><span class="syntaxkeyword">]&nbsp;=&nbsp;@</span><span class="syntaxdefault">ip2</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">position<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">invalidate<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;2&nbsp;</span><span class="syntaxcomment">#&nbsp;the&nbsp;second&nbsp;control&nbsp;point&nbsp;-&nbsp;tangency&nbsp;at&nbsp;start<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">ip</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">pick&nbsp;view</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">x</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">y</span><span class="syntaxkeyword">,&nbsp;@</span><span class="syntaxdefault">ip1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">if(&nbsp;@</span><span class="syntaxdefault">ip</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">valid</span><span class="syntaxkeyword">?&nbsp;&&&nbsp;@</span><span class="syntaxdefault">ip&nbsp;</span><span class="syntaxkeyword">!=&nbsp;@</span><span class="syntaxdefault">ip3&nbsp;</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@</span><span class="syntaxdefault">ip3</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">copy</span><span class="syntaxkeyword">!&nbsp;@</span><span class="syntaxdefault">ip<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">1</span><span class="syntaxkeyword">]&nbsp;=&nbsp;@</span><span class="syntaxdefault">ip3</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">position<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">invalidate<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">degree&nbsp;</span><span class="syntaxcomment">#&nbsp;the&nbsp;next&nbsp;to&nbsp;last&nbsp;point&nbsp;=&nbsp;tangency&nbsp;at&nbsp;end<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">ip</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">pick&nbsp;view</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">x</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">y</span><span class="syntaxkeyword">,&nbsp;@</span><span class="syntaxdefault">ip2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">if(&nbsp;@</span><span class="syntaxdefault">ip</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">valid</span><span class="syntaxkeyword">?&nbsp;&&&nbsp;@</span><span class="syntaxdefault">ip&nbsp;</span><span class="syntaxkeyword">!=&nbsp;@</span><span class="syntaxdefault">ip4&nbsp;</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@</span><span class="syntaxdefault">ip4</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">copy</span><span class="syntaxkeyword">!&nbsp;@</span><span class="syntaxdefault">ip<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">[@</span><span class="syntaxdefault">degree</span><span class="syntaxkeyword">-</span><span class="syntaxdefault">1</span><span class="syntaxkeyword">]&nbsp;=&nbsp;@</span><span class="syntaxdefault">ip4</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">position<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">invalidate<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;3.</span><span class="syntaxkeyword">.@</span><span class="syntaxdefault">degree</span><span class="syntaxkeyword">-</span><span class="syntaxdefault">1&nbsp;</span><span class="syntaxcomment">#&nbsp;internal&nbsp;points&nbsp;-&nbsp;if&nbsp;degree&nbsp;>&nbsp;3<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">ip</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">pick&nbsp;view</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">x</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">y<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">if(&nbsp;@</span><span class="syntaxdefault">ip</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">valid</span><span class="syntaxkeyword">?&nbsp;&&&nbsp;@</span><span class="syntaxdefault">ip&nbsp;</span><span class="syntaxkeyword">!=&nbsp;@</span><span class="syntaxdefault">ip5&nbsp;</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@</span><span class="syntaxdefault">ip5</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">copy</span><span class="syntaxkeyword">!&nbsp;@</span><span class="syntaxdefault">ip<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">[@</span><span class="syntaxdefault">state</span><span class="syntaxkeyword">-</span><span class="syntaxdefault">1</span><span class="syntaxkeyword">]&nbsp;=&nbsp;@</span><span class="syntaxdefault">ip5</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">position<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">invalidate<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />&nbsp;&nbsp;&nbsp;&nbsp;end<br />&nbsp;&nbsp;&nbsp;&nbsp;view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">tooltip&nbsp;</span><span class="syntaxkeyword">=&nbsp;@</span><span class="syntaxdefault">ip</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">tooltip&nbsp;</span><span class="syntaxkeyword">if&nbsp;@</span><span class="syntaxdefault">ip</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">valid</span><span class="syntaxkeyword">?<br /></span><span class="syntaxdefault">end<br /><br />def&nbsp;create_curve<br />&nbsp;&nbsp;&nbsp;&nbsp;curve&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">Bezier</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">curve&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">20<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxcomment">#&nbsp;see&nbsp;if&nbsp;this&nbsp;fills&nbsp;in&nbsp;any&nbsp;new&nbsp;faces<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">if(&nbsp;</span><span class="syntaxdefault">curve&nbsp;</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">edge1&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">curve</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">edge1</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">find_faces<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxcomment">#&nbsp;Attach&nbsp;an&nbsp;attribute&nbsp;to&nbsp;the&nbsp;curve&nbsp;with&nbsp;the&nbsp;array&nbsp;of&nbsp;points<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">curve&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">edge1</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">curve<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">if(&nbsp;</span><span class="syntaxdefault">curve&nbsp;</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">curve</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">set_attribute&nbsp;</span><span class="syntaxstring">"skp"</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxstring">"crvtype"</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxstring">"Bezier"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">curve</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">set_attribute&nbsp;</span><span class="syntaxstring">"skp"</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxstring">"crvpts"</span><span class="syntaxkeyword">,&nbsp;@</span><span class="syntaxdefault">pts<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;end<br />&nbsp;&nbsp;&nbsp;&nbsp;self</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">reset<br />end<br /><br />def&nbsp;onLButtonDown</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">flags</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">x</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">y</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxcomment">#&nbsp;TODO;&nbsp;Use&nbsp;the&nbsp;two&nbsp;point&nbsp;form&nbsp;of&nbsp;the&nbsp;input&nbsp;point&nbsp;finder&nbsp;to&nbsp;get&nbsp;the&nbsp;new&nbsp;points.<br />&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;I&nbsp;need&nbsp;a&nbsp;way&nbsp;to&nbsp;generate&nbsp;an&nbsp;ip&nbsp;at&nbsp;a&nbsp;given&nbsp;position&nbsp;from&nbsp;code.<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">ip</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">pick&nbsp;view</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">x</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">y<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">if(&nbsp;@</span><span class="syntaxdefault">ip</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">valid</span><span class="syntaxkeyword">?&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;@</span><span class="syntaxdefault">state<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">]&nbsp;=&nbsp;@</span><span class="syntaxdefault">ip</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">position<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sketchup</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">set_status_text&nbsp;</span><span class="syntaxstring">"Click&nbsp;for&nbsp;end&nbsp;point"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">state&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">degree<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">create_curve<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">2</span><span class="syntaxkeyword">]&nbsp;=&nbsp;@</span><span class="syntaxdefault">ip</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">position<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">state&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sketchup</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">set_status_text&nbsp;</span><span class="syntaxstring">"Click&nbsp;for&nbsp;point&nbsp;2"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">when&nbsp;2.</span><span class="syntaxkeyword">..@</span><span class="syntaxdefault">degree<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nextstate&nbsp;</span><span class="syntaxkeyword">=&nbsp;@</span><span class="syntaxdefault">state</span><span class="syntaxkeyword">+</span><span class="syntaxdefault">1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">nextstate</span><span class="syntaxkeyword">]&nbsp;=&nbsp;@</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">[@</span><span class="syntaxdefault">state</span><span class="syntaxkeyword">]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">[@</span><span class="syntaxdefault">state</span><span class="syntaxkeyword">]&nbsp;=&nbsp;@</span><span class="syntaxdefault">ip</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">position<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">state&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">nextstate<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sketchup</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">set_status_text&nbsp;</span><span class="syntaxstring">"Click&nbsp;for&nbsp;point&nbsp;#{@state}"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">end<br />&nbsp;&nbsp;&nbsp;&nbsp;end<br />end<br /><br />def&nbsp;onCancel</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">flag</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">invalidate&nbsp;</span><span class="syntaxkeyword">if&nbsp;@</span><span class="syntaxdefault">drawn<br />&nbsp;&nbsp;&nbsp;&nbsp;reset<br />end<br /><br />def&nbsp;onUserText</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">text</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxcomment">#&nbsp;get&nbsp;the&nbsp;degree&nbsp;from&nbsp;the&nbsp;text<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">newdegree&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">text</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">to_i<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">if(&nbsp;</span><span class="syntaxdefault">newdegree&nbsp;</span><span class="syntaxkeyword">>&nbsp;</span><span class="syntaxdefault">0&nbsp;</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@</span><span class="syntaxdefault">degree&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">newdegree<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">create_curve&nbsp;</span><span class="syntaxkeyword">if(&nbsp;@</span><span class="syntaxdefault">state&nbsp;</span><span class="syntaxkeyword">>&nbsp;@</span><span class="syntaxdefault">degree&nbsp;</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">UI</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">beep<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sketchup</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">set_status_text&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">degree</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">SB_VCB_VALUE<br />&nbsp;&nbsp;&nbsp;&nbsp;end<br />end<br /><br />def&nbsp;getExtents<br />&nbsp;&nbsp;&nbsp;&nbsp;bb&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">Geom</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">BoundingBox</span><span class="syntaxkeyword">.new<br />&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;@</span><span class="syntaxdefault">state&nbsp;</span><span class="syntaxkeyword">==&nbsp;</span><span class="syntaxdefault">0&nbsp;</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxcomment">#&nbsp;We&nbsp;are&nbsp;getting&nbsp;the&nbsp;first&nbsp;point<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">if(&nbsp;@</span><span class="syntaxdefault">ip</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">valid</span><span class="syntaxkeyword">?&nbsp;&&&nbsp;@</span><span class="syntaxdefault">ip</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">display</span><span class="syntaxkeyword">?&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">bb</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">add&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">ip</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">position<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">bb</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">add&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">pts<br />&nbsp;&nbsp;&nbsp;&nbsp;end<br />&nbsp;&nbsp;&nbsp;&nbsp;bb<br />end<br /><br />def&nbsp;draw</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxcomment">#&nbsp;Show&nbsp;the&nbsp;current&nbsp;input&nbsp;point<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">if(&nbsp;@</span><span class="syntaxdefault">ip</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">valid</span><span class="syntaxkeyword">?&nbsp;&&&nbsp;@</span><span class="syntaxdefault">ip</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">display</span><span class="syntaxkeyword">?&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@</span><span class="syntaxdefault">ip</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">draw</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@</span><span class="syntaxdefault">drawn&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">true<br />&nbsp;&nbsp;&nbsp;&nbsp;end<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxcomment">#&nbsp;show&nbsp;the&nbsp;curve<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">if(&nbsp;@</span><span class="syntaxdefault">state&nbsp;</span><span class="syntaxkeyword">==&nbsp;</span><span class="syntaxdefault">1&nbsp;</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxcomment">#&nbsp;just&nbsp;draw&nbsp;a&nbsp;line&nbsp;from&nbsp;the&nbsp;start&nbsp;to&nbsp;the&nbsp;end&nbsp;point<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">set_color_from_line</span><span class="syntaxkeyword">(@</span><span class="syntaxdefault">ip1</span><span class="syntaxkeyword">,&nbsp;@</span><span class="syntaxdefault">ip2</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">draw</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">GL_LINE_STRIP</span><span class="syntaxkeyword">,&nbsp;@</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@</span><span class="syntaxdefault">drawn&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">true<br />&nbsp;&nbsp;&nbsp;&nbsp;elsif</span><span class="syntaxkeyword">(&nbsp;@</span><span class="syntaxdefault">state&nbsp;</span><span class="syntaxkeyword">>&nbsp;</span><span class="syntaxdefault">1&nbsp;</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxcomment">#&nbsp;draw&nbsp;the&nbsp;curve<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">drawing_color&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxstring">"black"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">curvepts&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">Bezier</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">points</span><span class="syntaxkeyword">(@</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">12</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">draw</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">GL_LINE_STRIP</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">curvepts</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxcomment">#&nbsp;draw&nbsp;the&nbsp;control&nbsp;polygon<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;determine&nbsp;the&nbsp;colos&nbsp;for&nbsp;the&nbsp;first&nbsp;and&nbsp;last&nbsp;segments&nbsp;from&nbsp;the&nbsp;input&nbsp;points<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">case&nbsp;@</span><span class="syntaxdefault">state<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">set_color_from_line</span><span class="syntaxkeyword">(@</span><span class="syntaxdefault">ip1</span><span class="syntaxkeyword">,&nbsp;@</span><span class="syntaxdefault">ip3</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">draw</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">GL_LINE_STRIP</span><span class="syntaxkeyword">,&nbsp;@</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">],&nbsp;@</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">1</span><span class="syntaxkeyword">])<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">drawing_color&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxstring">"gray"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">draw</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">GL_LINE_STRIP</span><span class="syntaxkeyword">,&nbsp;@</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">1.</span><span class="syntaxkeyword">.-</span><span class="syntaxdefault">1</span><span class="syntaxkeyword">])<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">when&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">degree<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">drawing_color&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxstring">"gray"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">draw</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">GL_LINE_STRIP</span><span class="syntaxkeyword">,&nbsp;@</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">0.</span><span class="syntaxkeyword">.-</span><span class="syntaxdefault">2</span><span class="syntaxkeyword">])<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">set_color_from_line</span><span class="syntaxkeyword">(@</span><span class="syntaxdefault">ip2</span><span class="syntaxkeyword">,&nbsp;@</span><span class="syntaxdefault">ip4</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">draw</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">GL_LINE_STRIP</span><span class="syntaxkeyword">,&nbsp;@</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">[@</span><span class="syntaxdefault">degree</span><span class="syntaxkeyword">-</span><span class="syntaxdefault">1</span><span class="syntaxkeyword">],&nbsp;@</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">[@</span><span class="syntaxdefault">degree</span><span class="syntaxkeyword">])<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">drawing_color&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxstring">"gray"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">draw</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">GL_LINE_STRIP</span><span class="syntaxkeyword">,&nbsp;@</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">end<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">drawn&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">true<br />&nbsp;&nbsp;&nbsp;&nbsp;end<br />end<br /><br />end&nbsp;</span><span class="syntaxcomment">#&nbsp;class&nbsp;BezierTool<br /><br />#-----------------------------------------------------------------------------<br />#&nbsp;Define&nbsp;the&nbsp;tool&nbsp;class&nbsp;for&nbsp;editing&nbsp;Bezier&nbsp;curves<br /><br /></span><span class="syntaxkeyword">class&nbsp;</span><span class="syntaxdefault">EditBezierTool<br /><br />def&nbsp;activate<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">state&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">0<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">drawn&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">false<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">selection&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">nil<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">pt_to_move&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">nil<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxcomment">#&nbsp;Make&nbsp;sure&nbsp;that&nbsp;there&nbsp;is&nbsp;really&nbsp;a&nbsp;Bezier&nbsp;curve&nbsp;selected<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">curve&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">Bezier</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">selected_curve<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">if(&nbsp;</span><span class="syntaxdefault">not&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">curve&nbsp;</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">Sketchup</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">active_model</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">select_tool&nbsp;nil<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">return<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">end<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxcomment">#&nbsp;Get&nbsp;the&nbsp;control&nbsp;points<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">pts&nbsp;</span><span class="syntaxkeyword">=&nbsp;@</span><span class="syntaxdefault">curve</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">get_attribute&nbsp;</span><span class="syntaxstring">"skp"</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxstring">"crvpts"<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">if(&nbsp;</span><span class="syntaxdefault">not&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">pts&nbsp;</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">UI</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">beep<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sketchup</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">active_model</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">select_tool&nbsp;nil<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">return<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">end<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxcomment">#&nbsp;Get&nbsp;the&nbsp;curve&nbsp;points&nbsp;from&nbsp;the&nbsp;vertices<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">vertices&nbsp;</span><span class="syntaxkeyword">=&nbsp;@</span><span class="syntaxdefault">curve</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">vertices<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">crvpts&nbsp;</span><span class="syntaxkeyword">=&nbsp;@</span><span class="syntaxdefault">vertices</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">collect&nbsp;</span><span class="syntaxkeyword">{|</span><span class="syntaxdefault">v</span><span class="syntaxkeyword">|&nbsp;</span><span class="syntaxdefault">v</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">position</span><span class="syntaxkeyword">}<br />&nbsp;&nbsp;&nbsp;&nbsp;@</span><span class="syntaxdefault">numseg&nbsp;</span><span class="syntaxkeyword">=&nbsp;@</span><span class="syntaxdefault">vertices</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">length&nbsp;</span><span class="syntaxkeyword">-&nbsp;</span><span class="syntaxdefault">1<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">ip&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">Sketchup</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">InputPoint</span><span class="syntaxkeyword">.new<br /></span><span class="syntaxdefault">end<br /><br />def&nbsp;deactivate</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">invalidate&nbsp;</span><span class="syntaxkeyword">if&nbsp;@</span><span class="syntaxdefault">drawn<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">ip&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">nil<br />end<br /><br />def&nbsp;resume</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;@</span><span class="syntaxdefault">drawn&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">false<br />end<br /><br />def&nbsp;pick_point_to_move</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">x</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">y</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">old_pt_to_move&nbsp;</span><span class="syntaxkeyword">=&nbsp;@</span><span class="syntaxdefault">pt_to_move<br />&nbsp;&nbsp;&nbsp;&nbsp;ph&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">pick_helper&nbsp;x</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">y<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">selection&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">ph</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">pick_segment&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">pts<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">if(&nbsp;@</span><span class="syntaxdefault">selection&nbsp;</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;@</span><span class="syntaxdefault">selection&nbsp;</span><span class="syntaxkeyword"><&nbsp;</span><span class="syntaxdefault">0&nbsp;</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxcomment">#&nbsp;We&nbsp;got&nbsp;a&nbsp;point&nbsp;on&nbsp;a&nbsp;segment.&nbsp;&nbsp;Compute&nbsp;the&nbsp;point&nbsp;closest<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;to&nbsp;the&nbsp;pick&nbsp;ray.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">pickray&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">pickray&nbsp;x</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">y<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span class="syntaxkeyword">=&nbsp;-@</span><span class="syntaxdefault">selection<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;segment&nbsp;</span><span class="syntaxkeyword">=&nbsp;[@</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">i</span><span class="syntaxkeyword">-</span><span class="syntaxdefault">1</span><span class="syntaxkeyword">],&nbsp;@</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">i</span><span class="syntaxkeyword">]]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">result&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">Geom</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">closest_points&nbsp;segment</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">pickray<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">pt_to_move&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">result</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxcomment">#&nbsp;we&nbsp;got&nbsp;a&nbsp;control&nbsp;point<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">pt_to_move&nbsp;</span><span class="syntaxkeyword">=&nbsp;@</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">[@</span><span class="syntaxdefault">selection</span><span class="syntaxkeyword">]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">end<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@</span><span class="syntaxdefault">pt_to_move&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">nil<br />&nbsp;&nbsp;&nbsp;&nbsp;end<br />&nbsp;&nbsp;&nbsp;&nbsp;old_pt_to_move&nbsp;</span><span class="syntaxkeyword">!=&nbsp;@</span><span class="syntaxdefault">pt_to_move<br />end<br /><br />def&nbsp;onLButtonDown</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">flags</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">x</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">y</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxcomment">#&nbsp;Select&nbsp;the&nbsp;segment&nbsp;or&nbsp;control&nbsp;point&nbsp;to&nbsp;move<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">pick_point_to_move&nbsp;x</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">y</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">view<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">state&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">1&nbsp;</span><span class="syntaxkeyword">if(&nbsp;@</span><span class="syntaxdefault">selection&nbsp;</span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault">end<br /><br />def&nbsp;onLButtonUp</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">flags</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">x</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">y</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;if&nbsp;</span><span class="syntaxdefault">not&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">state&nbsp;</span><span class="syntaxkeyword">==&nbsp;</span><span class="syntaxdefault">1<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">state&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">0<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxcomment">#&nbsp;Update&nbsp;the&nbsp;actual&nbsp;curve.&nbsp;&nbsp;Move&nbsp;the&nbsp;vertices&nbsp;on&nbsp;the&nbsp;curve<br />&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;to&nbsp;the&nbsp;new&nbsp;curve&nbsp;points<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">if(&nbsp;@</span><span class="syntaxdefault">vertices</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">length&nbsp;</span><span class="syntaxkeyword">!=&nbsp;@</span><span class="syntaxdefault">crvpts</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">length&nbsp;</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">UI</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">messagebox&nbsp;</span><span class="syntaxstring">"Count&nbsp;of&nbsp;curve&nbsp;points&nbsp;is&nbsp;wrong!"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">return<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">end<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;model&nbsp;</span><span class="syntaxkeyword">=&nbsp;@</span><span class="syntaxdefault">vertices</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">].</span><span class="syntaxdefault">model<br />&nbsp;&nbsp;&nbsp;&nbsp;model</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">start_operation&nbsp;</span><span class="syntaxstring">"Edit&nbsp;Bezier&nbsp;Curve"<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxcomment">#&nbsp;Move&nbsp;the&nbsp;vertices<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">curve</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">move_vertices&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">crvpts<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxcomment">#&nbsp;Update&nbsp;the&nbsp;control&nbsp;points&nbsp;stored&nbsp;with&nbsp;the&nbsp;curve<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">curve</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">set_attribute&nbsp;</span><span class="syntaxstring">"skp"</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxstring">"crvpts"</span><span class="syntaxkeyword">,&nbsp;@</span><span class="syntaxdefault">pts<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;model</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">commit_operation<br />end<br /><br />def&nbsp;onMouseMove</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">flags</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">x</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">y</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxcomment">#&nbsp;Make&nbsp;sure&nbsp;that&nbsp;the&nbsp;control&nbsp;polygon&nbsp;is&nbsp;shown<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">invalidate&nbsp;</span><span class="syntaxkeyword">if&nbsp;</span><span class="syntaxdefault">not&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">drawn<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxcomment">#&nbsp;Move&nbsp;the&nbsp;selected&nbsp;point&nbsp;if&nbsp;state&nbsp;=&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">if(&nbsp;@</span><span class="syntaxdefault">state&nbsp;</span><span class="syntaxkeyword">==&nbsp;</span><span class="syntaxdefault">1&nbsp;</span><span class="syntaxkeyword">&&&nbsp;@</span><span class="syntaxdefault">selection&nbsp;</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@</span><span class="syntaxdefault">ip</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">pick&nbsp;view</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">x</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">y<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">return&nbsp;if&nbsp;</span><span class="syntaxdefault">not&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">ip</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">valid</span><span class="syntaxkeyword">?<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;@</span><span class="syntaxdefault">selection&nbsp;</span><span class="syntaxkeyword">>=&nbsp;</span><span class="syntaxdefault">0&nbsp;</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxcomment">#&nbsp;Moving&nbsp;a&nbsp;control&nbsp;point<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">pt_to_move&nbsp;</span><span class="syntaxkeyword">=&nbsp;@</span><span class="syntaxdefault">ip</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">position<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">[@</span><span class="syntaxdefault">selection</span><span class="syntaxkeyword">]&nbsp;=&nbsp;@</span><span class="syntaxdefault">pt_to_move<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxcomment">#&nbsp;moving&nbsp;a&nbsp;segment<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">pt&nbsp;</span><span class="syntaxkeyword">=&nbsp;@</span><span class="syntaxdefault">ip</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">position<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vec&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">pt&nbsp;</span><span class="syntaxkeyword">-&nbsp;@</span><span class="syntaxdefault">pt_to_move<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span class="syntaxkeyword">=&nbsp;-@</span><span class="syntaxdefault">selection<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">i</span><span class="syntaxkeyword">-</span><span class="syntaxdefault">1</span><span class="syntaxkeyword">].</span><span class="syntaxdefault">offset</span><span class="syntaxkeyword">!&nbsp;</span><span class="syntaxdefault">vec<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">i</span><span class="syntaxkeyword">].</span><span class="syntaxdefault">offset</span><span class="syntaxkeyword">!&nbsp;</span><span class="syntaxdefault">vec<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">pt_to_move&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">pt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">crvpts&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">Bezier</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">points</span><span class="syntaxkeyword">(@</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">,&nbsp;@</span><span class="syntaxdefault">numseg</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">invalidate<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">else&nbsp;</span><span class="syntaxcomment">#&nbsp;state&nbsp;!=&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;See&nbsp;if&nbsp;we&nbsp;can&nbsp;select&nbsp;something&nbsp;to&nbsp;move<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">invalidate&nbsp;</span><span class="syntaxkeyword">if(&nbsp;</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">pick_point_to_move</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">x</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">y</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">)&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">end<br />end<br /><br />def&nbsp;getMenu</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">menu</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">menu</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">add_item</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"Done"</span><span class="syntaxkeyword">)&nbsp;{</span><span class="syntaxdefault">Sketchup</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">active_model</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">select_tool&nbsp;nil</span><span class="syntaxkeyword">}<br /></span><span class="syntaxdefault">end<br /><br />def&nbsp;getExtents<br />&nbsp;&nbsp;&nbsp;&nbsp;bb&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">Geom</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">BoundingBox</span><span class="syntaxkeyword">.new<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">bb</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">add&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">pts<br />&nbsp;&nbsp;&nbsp;&nbsp;bb<br />end<br /><br />def&nbsp;draw</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxcomment">#&nbsp;Draw&nbsp;the&nbsp;control&nbsp;polygon<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">drawing_color&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxstring">"gray"<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">draw</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">GL_LINE_STRIP</span><span class="syntaxkeyword">,&nbsp;@</span><span class="syntaxdefault">pts</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;@</span><span class="syntaxdefault">pt_to_move&nbsp;</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">draw_points</span><span class="syntaxkeyword">(@</span><span class="syntaxdefault">pt_to_move</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">10</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">1</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxstring">"red"</span><span class="syntaxkeyword">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">end<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">if(&nbsp;@</span><span class="syntaxdefault">state&nbsp;</span><span class="syntaxkeyword">==&nbsp;</span><span class="syntaxdefault">1&nbsp;</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">drawing_color&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxstring">"black"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">view</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">draw</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">GL_LINE_STRIP</span><span class="syntaxkeyword">,&nbsp;@</span><span class="syntaxdefault">crvpts</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">end<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">@</span><span class="syntaxdefault">drawn&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">true<br />end<br /><br />end&nbsp;</span><span class="syntaxcomment">#&nbsp;class&nbsp;EditBezierTool<br /><br />#-----------------------------------------------------------------------------<br /><br />#&nbsp;Function&nbsp;to&nbsp;test&nbsp;to&nbsp;see&nbsp;if&nbsp;the&nbsp;selection&nbsp;set&nbsp;contains&nbsp;only&nbsp;a&nbsp;Bezier&nbsp;curve<br />#&nbsp;Returns&nbsp;the&nbsp;curve&nbsp;if&nbsp;there&nbsp;is&nbsp;one&nbsp;or&nbsp;else&nbsp;nil<br /></span><span class="syntaxdefault">def&nbsp;Bezier</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">selected_curve<br />&nbsp;&nbsp;&nbsp;&nbsp;ss&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">Sketchup</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">active_model</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">selection<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">return&nbsp;</span><span class="syntaxdefault">nil&nbsp;</span><span class="syntaxkeyword">if&nbsp;</span><span class="syntaxdefault">not&nbsp;ss</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">is_curve</span><span class="syntaxkeyword">?<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">edge&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">ss</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">first<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">return&nbsp;</span><span class="syntaxdefault">nil&nbsp;</span><span class="syntaxkeyword">if&nbsp;</span><span class="syntaxdefault">not&nbsp;edge</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">kind_of</span><span class="syntaxkeyword">?&nbsp;</span><span class="syntaxdefault">Sketchup</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">Edge<br />&nbsp;&nbsp;&nbsp;&nbsp;curve&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">edge</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">curve<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">return&nbsp;</span><span class="syntaxdefault">nil&nbsp;</span><span class="syntaxkeyword">if&nbsp;</span><span class="syntaxdefault">not&nbsp;curve<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">return&nbsp;</span><span class="syntaxdefault">nil&nbsp;</span><span class="syntaxkeyword">if&nbsp;</span><span class="syntaxdefault">curve</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">get_attribute</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"skp"</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxstring">"crvtype"</span><span class="syntaxkeyword">)&nbsp;!=&nbsp;</span><span class="syntaxstring">"Bezier"<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">curve<br />end<br /><br /></span><span class="syntaxcomment">#&nbsp;Edit&nbsp;a&nbsp;selected&nbsp;Bezier&nbsp;curve<br /></span><span class="syntaxdefault">def&nbsp;Bezier</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">edit_curve<br />&nbsp;&nbsp;&nbsp;&nbsp;curve&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">Bezier</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">selected_curve<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">if(&nbsp;</span><span class="syntaxdefault">not&nbsp;curve&nbsp;</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">UI</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">beep<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">return<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">end<br />&nbsp;&nbsp;&nbsp;&nbsp;Sketchup</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">active_model</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">select_tool&nbsp;EditBezierTool</span><span class="syntaxkeyword">.new<br /></span><span class="syntaxdefault">end<br /><br /></span><span class="syntaxcomment">#&nbsp;Select&nbsp;the&nbsp;Bezier&nbsp;curve&nbsp;tool<br /></span><span class="syntaxdefault">def&nbsp;Bezier</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">tool</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">degree</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">3</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">Sketchup</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">active_model</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">select_tool&nbsp;BezierTool</span><span class="syntaxkeyword">.new(</span><span class="syntaxdefault">degree</span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault">end<br /><br /></span><span class="syntaxcomment">#&nbsp;Add&nbsp;a&nbsp;menu&nbsp;choice&nbsp;for&nbsp;creating&nbsp;bezier&nbsp;curves<br /></span><span class="syntaxkeyword">if(&nbsp;</span><span class="syntaxdefault">not&nbsp;file_loaded</span><span class="syntaxkeyword">?(</span><span class="syntaxstring">"bezier.rb"</span><span class="syntaxkeyword">)&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">add_separator_to_menu</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"Draw"</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">UI</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">menu</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"Draw"</span><span class="syntaxkeyword">).</span><span class="syntaxdefault">add_item</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"Bezier&nbsp;Curves"</span><span class="syntaxkeyword">)&nbsp;{&nbsp;</span><span class="syntaxdefault">Bezier</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">tool&nbsp;</span><span class="syntaxkeyword">}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxcomment">#&nbsp;Add&nbsp;a&nbsp;context&nbsp;menu&nbsp;handler&nbsp;to&nbsp;let&nbsp;you&nbsp;edit&nbsp;a&nbsp;Bezier&nbsp;curve<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">UI</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">add_context_menu_handler&nbsp;</span><span class="syntaxkeyword">do&nbsp;|</span><span class="syntaxdefault">menu</span><span class="syntaxkeyword">|<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;</span><span class="syntaxdefault">Bezier</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">selected_curve&nbsp;</span><span class="syntaxkeyword">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">menu</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">add_separator<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menu</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">add_item</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"Edit&nbsp;Bezier&nbsp;Curve"</span><span class="syntaxkeyword">)&nbsp;{&nbsp;</span><span class="syntaxdefault">Bezier</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">edit_curve&nbsp;</span><span class="syntaxkeyword">}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">end<br />&nbsp;&nbsp;&nbsp;&nbsp;end<br /><br />end<br /><br />end&nbsp;</span><span class="syntaxcomment">#&nbsp;module&nbsp;Bezier<br /></span><span class="syntaxdefault">file_loaded</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"bezier.rb"</span><span class="syntaxkeyword">)&nbsp;</span><span class="syntaxdefault"></span>
      
      posted in Developers' Forum
      piratebrianP
      piratebrian
    • 3 AxisThermwood CNC router miter cuts

      Edit Note: I need to update this file to reflect some improvements. It is important to note that the ball end mill miter passes cut shy by about 15-20 thousandths to preserve the vacuum table hold on the small parts I often cut.

      Original post:
      I just posted something (I think) useful on the SketchUp 3-D warehouse for use with most Thermwood CNC routers. It is the layer convention names necessary to cut miter angles on a 3 Axis router by directly importing the dxf drawing from SketchUp Pro to the CNC machine. This eliminates the need to use either Profile Modeler, Solidworks or MasterCam (all great programs, but two less links in the CAD/CAD/CAM/CNC chain). To bring a mitered cut part from Sketchup to the machine it now takes 3-4 steps per edge rather than having to redraw the entire part and additional steps per edge. The Thermwood CNC machines have built-in control nesting software that allows direct DXF imports. I don't know what other CNC routers have this capability. The cutting depths and positions are based off of a large excel file that I will latter extract the equations to make a plug-in specifically for use with the Thermwood routers.
      http://sketchup.google.com/3dwarehouse/details?mid=2258e73b3416beb5ed5c9291237154c3&prevstart=0
      Once I rewrite the equations I could use some help with the plugin.

      posted in Woodworking
      piratebrianP
      piratebrian
    • 1 / 1