Select patterns on a specific layer

edited January 2018 in Ruby Scripting
Hi Klayout team,

I'm working on a program in ruby which include the calculation of the density area (a macro I got on your site). The patterns must be selected before running this calculation. But in my program, I do not want any user intervention. So I tried to find a way to select the patterns in a specific layer but I did not find examples in the forum.
Could you please give me a short example:
- Select the layer on which the patterns are,
- Select these patterns

Thanks in advance for your help, and thanks for this forum which is of great help.

Best regards
Eric.

Comments

  • edited November -1

    Hi Eric,

    you mean to establish a selection of certain shapes?

    If you have the shapes, you can directly run the density on these shapes rather than first selecting them and then running the computation on selected shapes.

    The key to this is the Region class and it's area method. You feed your shapes into the region object and calculate the area using the area method.

    Matthias

  • edited November -1
    Hi Matthias,

    thanks a lot for your prompt reply.
    To answer your question, I want to select all polygons of a single layer to know his density area.
    It's the first time I use Ruby language and I do not know how to proceed.
    Here is the code I want to modify:

    active_area=31.200
    rayon_active_area=(active_area/2)
    aire_active_area=(rayon_active_area*rayon_active_area)*3.14

    $compute_total_area = MenuAction.new( "Compute total area of selected shapes", "" ) do

    app = RBA::Application.instance
    mw = app.main_window

    lv = mw.current_view
    if lv == nil
    raise "No view selected"
    end

    total_area = 0.0

    lv.each_object_selected do |obj|

    shape = obj.shape
    layout = lv.cellview(obj.cv_index).layout

    if shape.is_polygon? || shape.is_box? || shape.is_path?

    polygon = shape.polygon
    a = polygon.area
    m = obj.trans.mag * layout.dbu
    total_area += (a * m * m)/10000
    end

    end

    RBA::MessageBox.info("Total area", "Transparent area is #{'%.2f' % (total_area/aire_active_area)}%", RBA::MessageBox.b_ok)

    end


    Could you please give me your input on how to adapt this code to my need ?
    Thanks again.
    Eric
  • edited November -1

    Hi Eric,

    this code will take the selected shapes, right. But you mentioned you'd like to take the pattern (shapes?) from somewhere else. Where from? The whole layer? Including child cells? How do you know the layer the shapes are supposed to be taken from?

    How am I supposed to know what you need? I can't read thoughts.

    Matthias

  • edited November -1
    Hi Matthias,

    sorry, I was not clear enough:
    - I mentioned 'Pattern' but you can translate by shape (or polygon),
    - all shapes are merged in the layer 1 (after generating a mapping and flattening the instances),
    - the cell containing these shapes is named 'Active_area'
    - the calculation must be applied on the entire layer (layer 1). That will always be the case.
    - no child cells

    Let me know if you need further information.
    Thanks
    Eric.
  • edited November -1

    Hi Eric,

    in the DRC feature, that's a two lines

    cell("Active_area")   # omit this line if you simply want to use "top cell"
    puts input(1, 0).area
    

    The result will be printed to the console when you run the DRC script in the Macro IDE.

    Matthias

  • edited November -1
    Hi Matthias,

    thanks a lot. I have included it to my program. That's work perfectly.

    I have an another question on a different subject: I have a path composed of 3 points (like a 'L'). The size is random. In a loop, I duplicate it with an angle.
    Each time I duplicate this path, I want to keep the angle of 90° (of the 'L').
    Currently, this is not the case with my program.

    Here is the part on the code:

    Random=rand(Range)

    a = i.to_f * Math::PI * 2.0 / n

    x1 = (4500000 + Random) * Math.cos(a)
    y1 = (4500000 + Random) * Math.sin(a)

    x2 = (Random2+rad) * Math.cos(a) +x1
    y2 = (Random2+rad) * Math.sin(a) +y1


    path = RBA::Path::new([RBA::Point::new(x1, y1), RBA::Point::new(x2, y2), RBA::Point::new(x2+60000, y2)] , width)
    cell.shapes(li).insert(path)


    I know I have to include a calculation for the third point but I did not find it yet. Could please help me on this subject ?*
    Thanks in advance.
    Eric
  • edited November -1

    Hi Eric,

    how about

    RBA::Point::new(x1+(y2-y1), y1-(x2-x1))
    

    for the third point?

    Matthias

  • edited November -1
    Hi Matthias,

    with you help, I found the solution:

    RBA::Point::new(x1 - (50 * Math.sin(a)), y1 + (50 * Math.cos(a)))

    Thanks a lot.
    Eric.
Sign In or Register to comment.