In this blog post I show how to create and manipulate any region object in AutoCAD with pyautocad. I will do so using the AddRegion()-method in pyautocad. pyautocad is one of several Python modules for AutoCAD. I have already covered AutoCAD scripting in Python extensively on this blog.
Region object in AutoCAD
The AutoCAD region object represents 2D enclosed areas. AutoCAD region objects can be polylines, circles, arcs, splines, rectangles etc., as long as they are connected and thereby form a closed entity.
AutoCAD region objects can be combined and used as a single regions. This can be done by utilizing some methods. This includes methods such as Union, Intersection or Subtraction.
Collectively these methods are called AutoCAD boolean methods.
Creating a region object in AutoCAD (win32com etc.)
It is not possible to a create region object in AutoCAD using pyautocad. This is due to some module limitations. Hence in this article I will use the AddRegion() method using the win32com and pythoncom Python modules.
Before creating any AutoCAD region object I bootstrapped my application. This facilitates a connection to AutoCAD. It furthermore allows me to fetch the model space.
In the figure below I display an enclosed AutoCAD polyline object with an overlapping circle.
I created the objects in above figure using the code below:
#Enclosed polyline
pl1 = acad.AddPolyline(ad(0,0,0,1000,0,0,1000,500,0,750,500,0,750,1000,0,250,1000,0,250,500,0,0,500,0,0,0,0))
#Circle
c1 = acad.AddCircle(ap(500, 1000, 0), 250)
Now, to create a region I must pass an array of enclosed AutoCAD objects to the AddRegion()-method. I do so below:
#Syntax:
#object.AddRegion(array_of_enclosed_objects)
#Here object can be Block, ModelSpace or PaperSpace
acad.AddRegion(win32com.client.VARIANT(VT_ARRAY | VT_DISPATCH, (pl1, c1)))
Here I can see that the object is converted into a region. The same is true for the polyline. The region object the original one.
Performing boolean operations on region objects
Boolean operations can be performed on 3D solids as well as on AutoCAD region objects.
To use the region object I need to fetch the same from the AutoCAD template using iteration. This is because the AddRegion()-method returns nothing but an array of AutoCAD objects.
In the Python coding example shown below I use a dictionary to save AutoCAD region objects that I create.
regions = {}
i=0
for l in acad1.iter_objects_fast(object_name_or_list="Region"):
print(str(l.ObjectID) + ": " + l.ObjectName)
key = "reg" + str(i)
regions[key] = l
i+=1
As mentioned by me earlier in this post I can perform three types of boolean operations to create a single union of regions:
- Union (0)
- Intersection (1)
- Subtraction (2).
I will use the numbers mentioned in the brackets of the above listed methods as input parameters. When calling the Boolean()-method they declare the type of boolean operation that I want to perform. At the same time I will move the region object to the right. This will make the difference more clear.
#Syntax:
#object1.Boolean(operation_id, object2)
#Here objects could be 3DSolids or Regions
regions["reg1"].Boolean(2, regions["reg0"])
for l in acad1.iter_objects_fast(object_name_or_list="Region"):
print(str(l.ObjectID) + ": " + l.ObjectName)
l.Move(APoint(0, 0, 0), APoint(1500, 0, 0))
It is clear that the new object is created as a single unified region from its parent regions.
Concluding remarks and related content
For further blog posts covering AutoCAD automatization please check my other blog posts related to pyautocad and pywin32. Please leave any questions that you might have as a comment below. Feel free to contact me for any technical assistance. You can do so by using our contact form.
Here are some related articles covering AutoCAD automatization and AutoCAD scripting in Python:
- Link: Python for AutoCAD pyautocad module
- Link: add() method in pyautocad
- Link: Solved call was rejected by callee in pythoncom
- Link: Tree data structure for AutoCAD objects using Python
- Link: Extending the objects in AutoCAD using pyautocad in Python
- Link: Using Python lists and dictionaries to work with AutoCAD objects with pyautocad
- Link: Hatching objects on AutoCAD template using pywin32 in Python
- Link: Raster image object in AutoCAD with pyautocad in Python
- Link: Working with 3D mesh object in AutoCAD using pyautocad in Python
- Link: Creating adouble constructor using pywin32 in Python
- Link: Creating apoint method using pywin32 in Python
- Link: Python integration with AutoCAD using pywin32 and win32com
- Link: Deleting objects in a AutoCAD template with pyautocad and pywin32 in Python
- Link: Mirror object on a 2D plane with pyautocad in Python
- Link: Working with texts in Autocad using pyautocad in Python
- Link: Polar arrays in AutoCAD using pyautocad in Python
- Link: Rectangular arrays in AutoCAD using pyautocad in Python
- Link: Operations with AutoCAD objects using pyautocad in Python
- Link: Solid objects in AutoCAD using pyautocad in Python
- Link: Working with helices in AutoCAD using pyautocad in Python
- Link: Drawing splines in AutoCAD with pyautocad in Python
- Link: Polylines in pyautocad for drawing AutoCAD polygons in Python
- Link: Drawing ellipse arcs in AutoCAD using pyautocad in Python
- Link: Drawing arcs in AutoCAD using pyautocad in Python
- Link: Near simultaneous factory design and process optimization with Promodel AutoCAD edition
- Link: Python for AutoCAD pyautocad module
Civil engineer interested in automation in core subjects such as civil, mechanical and electrical, using IT skills comprising cloud computing, devops, programming languages and databases along with the technical skills gained while working as a civil engineer since past 3 years.
2 comments
Thanks for your courses.
now please can you show me how to get the coordinates of the 2 corners of elastic window selection. i want to use it in python to draw my own grid.
(in vba we use getcorner and getpoint, but in python i get error…)
now i use:
def dessin_cadre(xmin,ymin,xmax,ymax):
#
global xmin_cadre,ymin_cadre,xmax_cadre,ymax_cadre
acad = Autocad(create_if_not_exists=True)
Table.RegenerateTableSuppressed = True
ecart = 50
mylayer =0
xmin_cadre,ymin_cadre=(xmin – ecart),(ymin – ecart)
xmax_cadre,ymax_cadre=(xmax + ecart),(ymax + ecart)
p1=Topopt(“minmin”,xmin_cadre,ymin_cadre,0)
p2=Topopt(“minmax”,xmin_cadre,ymax_cadre,0)
p3=Topopt(“maxmax”,xmax_cadre,ymax_cadre,0)
p4=Topopt(“maxmin”,xmax_cadre,ymin_cadre,0)
dessin_ligne(p1,p2,mylayer)
dessin_ligne(p2,p3,mylayer)
dessin_ligne(p3,p4,mylayer)
dessin_ligne(p4,p1,mylayer)
but i want to select thows 2 points from the screen
Thank you for your courses.
I am trying to add a region but its giving an error
TypeError: Cannot put win32com.client.VARIANT(8201, (, )) in VARIANT
How can i fix this?