Search code examples
rubyautocadcadsketchupsolidworks

CAD: lines to solid programmatically


How to convert a set of connected lines to a solid in CAD applications? Tool is being used can be AutoCAD, SketchUp, Solidworks, FreeCAD, or any other software you may know that can do this simple task painlessly. Note that the following graphics is only for demonstration. The desired resulting should be a valid CAD solid to be able apply all related operations such as boolean ones etc.

enter image description here

Just remember the job needs to be done thousands times so manual approaches are not suitable. Even some help to write a piece of code for this job is much appreciated (in any language), so you may explain how to code a simple DXF writer for just Solid, for example. Our play with some DXF exporters in Python was not successful.

Upadate: a simple Ruby code for SketchUp or VBA code for AutoCAD or Python for FreeCAD could be of most help.


Solution

  • Here are some Google SketchUp Ruby API snippets. It's very simple, using the Edge#find_faces method that will make SketchUp try and find possible faces for the given edge. https://developers.google.com/sketchup/docs/ourdoc/edge#find_faces

    Find faces for current selection:

    # Find faces for selected edges:
    model = Sketchup.active_model
    model.start_operation( 'Find Faces in Selection', true )
    for entity in model.selection.to_a
      next unless entity.is_a?( Sketchup::Edge )
      entity.find_faces
    end
    model.commit_operation
    

    Find faces for current context:

    # Find faces for current context:
    model = Sketchup.active_model
    model.start_operation( 'Find Faces in Current Context', true )
    for entity in model.active_entities.to_a
      next unless entity.is_a?( Sketchup::Edge )
      entity.find_faces
    end
    model.commit_operation
    

    Find faces for all edges in model:

    # Find faces for all edges in model:
    model = Sketchup.active_model
    model.start_operation( 'Find Faces in Whole Model', true )
    for entity in model.entities.to_a
      next unless entity.is_a?( Sketchup::Edge )
      entity.find_faces
    end
    for definition in model.definitions
      next if definition.image?
      for entity in definition.entities.to_a
        next unless entity.is_a?( Sketchup::Edge )
        entity.find_faces
      end
    end
    model.commit_operation
    

    If you need to process a batch of DWG file for this you can automate that as well using Model#import to import the DWG files. https://developers.google.com/sketchup/docs/ourdoc/model#import

    This assumes that the edges are bounding coplanar surfaces. You will only get a solid if the wiregrid you import can represent one.