# Merging two polygons in a layer

Hi All,

I'm struggling with simply merging two polygons in a layer with Python scripting. Can someone help me figure this us?

MB

• edited March 2021

there is a thread here on Ruby
this can be converted to Python if needed if you know how,
you will have to figure out the Booleans to satisfy your requirements
https://www.klayout.de/forum/discussion/comment/4167#Comment_416744

• @tagger5896 Thanks very much for your response. I saw this thread before. However, I feel like this should be much easier than the thread. Also, what I'm trying to do should be a bit different from that thread.

I'm trying to create a layout from scratch by scripting it. First, I create an array of polygons and then another array of different polygons that overlap the first ones. Then, I want to merge these two sets of polygons that make up a part of my layout.

• edited March 2021

.

• edited March 2021

1.) If by "merge" you mean "lump together", you can just insert all polygons into the same cell/shapes container

2.) If by "merge" you mean "join polygons into one" ("union"), the easiest way to achieve this to work with the Region object as the thread suggests in a subcontext:

p1 = ... 1st polygon ...
p2 = ... 2nd polygon ...
r = pya.Region(p1) + pya.Region(p2)
for p r.merged().each():
... p gives you the polygons of the merged set (which there will be one in your case) ...

Region is far more general than Polygon and covers all corner cases such as polygons touching in one point and offers much more functionality. It's basically a collection of polygons.

Matthias

• @Matthias Thanks very much for your thorough answer. That saved my life!

• @Matthias @tagger5896
I used the following script to merge the polygons, but it seems not working. Do I make a mistake here?

for n in range(0, 4):

box4 = pya.DBox(0.0, 0.0, self.planacon_port_width, self.planacon_port_height).moved(-(self.planacon_cavity_width/2)+self.port4_dis_left, -(self.planacon_cavity_length/2)+self.port4_dis_bottom)
box4b = pya.DBox(0.0, 0.0, 1.1*self.port_extension_length, self.port_extension_width).moved(-(self.planacon_cavity_width/2)+self.port4_dis_left+self.planacon_port_width-(0.1*self.port_extension_length), -(self.planacon_cavity_length/2)+self.port4_dis_bottom+(self.planacon_port_height/2)-(self.port_extension_width/2))

port4 = pya.DPolygon(box4)
port4 = pya.DCplxTrans(1.0, False, False , 0.0,(self.planacon_port_height+self.planacon_port_pitch) * n) * port4

port4_ext = pya.DPolygon(box4b)
port4_ext = pya.DCplxTrans(1.0, False, False, 0.0, (self.planacon_port_height+self.planacon_port_pitch) * n) * port4_ext

merged_port = pya.Region(port4)+pya.Region(port4_ext)

merged_port.merge()

self.cell.shapes(self.metalrf_layer).insert(merged_port)
• The "Merge" function perfectly works as mentioned above by @Matthias or by @tagger5896 when I make a layout and work within the layout environment as follow:

region = pya.Region(planacon.begin_shapes_rec(metalrf))

region.merge()

layout.clear_layer(metalrf)

planacon.shapes(metalrf).insert(region)

However, if I want to make a pcell, the above script of course doesn't work. My question is how I can change this script to be able to merge also within a pcell.