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
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'sarea
method. You feed your shapes into the region object and calculate the area using the area method.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
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
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.
Hi Eric,
in the DRC feature, that's a two lines
The result will be printed to the console when you run the DRC script in the Macro IDE.
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
Hi Eric,
how about
for the third point?
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.