Jump to content
elmasea

On Python for autocad

Recommended Posts

elmasea

Hi I am seeking “partners” on studing python for autocad

 

 

I am a mechanical designer, an (italian) autocad user.

Until a few years ago I programmed in lisp, but then I have used VBA.

Now I'm learning python, as you know, powerful and easy to use

 

 

Of course I use win32com class

So I did the first routine about Python/Autocad that I try to explain briefly:

 

 

1) Reading all the characteristics of a selected entity:

 

 

acad = win32com.client.Dispatch("AutoCAD.Application")

doc = acad.ActiveDocument # Document object

ms = doc.ModelSpace # Modelspace "collection"

returnObj = doc.Utility.GetEntity() # "Select an object")

 

 

then I can display the properties of the selected entity

 

eg for a polyline:

 

 

returnObj[0].Coordinates ...

or other

Layer, Length, Linetype, LinetypeScale, Lineweight

 

 

But this is true only for a selected entity (GetEntity method),

 

2) Reading all the characteristics of a indexed entity:

When I get an entity at a given index

 

 

ms = doc.ModelSpace

i = 5 # index of the entity in the drawing (Modelspace)

entObj = ms.Item(i)

 

 

I can display only few properties

 

 

for example, always for a polyline :

 

 

entObj.Layer

entObj.ObjectName

 

 

but for other properties python tells me the object has no attribute 'for example Length, Coordinates,

 

 

Instead VBA does that

who wants to help me?

who wants to partecipate?

 

elmasea

 

 

Share this post


Link to post
Share on other sites
Lee Mac

You might find more interest in Python here...

 

Enjoy,

 

Lee

Share this post


Link to post
Share on other sites
elmasea

"""Sample to automate AutoCAD:

1) run an autocad drawing

2) read some drawing data:

number of objects in the ModelSpace;

the value of an AutoCAD system variable;

2) add to the drawing:

point;

line;

polyline.

 

In this code some examples of access to Autocad objects are presented.

We must handle variants used to pass array data in and out

of AutoCAD COM. Different variant types are possible using comtypes

(this is not true with win32com.client package).

This example should be improved especially in the user interface.

"""

 

import array

import comtypes.client

 

#Get running instance of the AutoCAD application

acad = comtypes.client.GetActiveObject("AutoCAD.Application")

# Document object

doc = acad.ActiveDocument

# Get the ModelSpace object

ms = doc.ModelSpace

 

# Get some useful data

DwgName = doc.Name # File name

count = ms.Count # Number of items in modelspace

 

# Get a variable name

sysVarName = 'DWGPREFIX' # directory of the drawing

varData = doc.GetVariable(sysVarName)

 

# view in Idle

print 'File: ', DwgName

print 'N. Items: ', count

 

# >>>> In ModelSpace:

# Add a POINT object

# Sets the value of an AutoCAD system variable.

# PDMODE and PDSIZE system variables control the appearance of point objects

sysVarName = "PDMODE" # specifies a Point shape

doc.SetVariable(sysVarName,3) # code 3 for X shape

sysVarName = "PDSIZE" # controls the size of the point

doc.SetVariable(sysVarName,3) # absolute size (3 units half height of icon point)

 

pt = array.array('d', [0,0,0]) # to convert in variant

point = ms.AddPoint(pt)

 

# Add a LINE

pt1 = array.array('d', [0.0,0.0,0]) # start point

pt2 = array.array('d', [20.0,20.0,0]) # end point

line = ms.AddLine(pt1, pt2)

 

# Add a POLYLINE

# We assign the vertices

ptl = []

pt = [20.0,20.0,0]

ptl = ptl + pt

pt = [40.0,30.0,0]

ptl = ptl + pt

pt = [70.0,40.0,0]

ptl = ptl + pt

ptlst = array.array('d', ptl)

pline = ms.AddPolyline(ptlst)

 

# Select an item

# The user selects an object (the polyline) by picking a point on the screen

returnObj = doc.Utility.GetEntity("Select Object:")

"""Each entity in autocad has a unique value.

Ex. for a line object the ObjectName is AcDbLine and the EntityType value is 19 """

# common code for line, polyline

print 'DXF entity name: ', returnObj[0].EntityName # it is the class name of the object

print returnObj[0].EntityType # the type of entity

print returnObj[0].Layer

print returnObj[0].Length

# only polyline

retCoord = returnObj[0].Coordinates

num_vertex = len(retCoord)/3

for i in range(num_vertex):

print returnObj[0].Coordinate(i)

 

print ">>>>>>>>>>"

Share this post


Link to post
Share on other sites
lode

Yes, I am also playing with the idea to move from vba.

And was wondering if everything one does with vba is possible with python.

Is it reliable? Is it depending on someone and some updates?

 

Python is fun, so, I am in!

 

Lode

Share this post


Link to post
Share on other sites
Jeff H

If you like python you could also consider F#.

Python is great but if you are mainly focusing on AutoCAD customization, you probably would benefit more using F#

Share this post


Link to post
Share on other sites
Hioushi

Hello,

 

Does anyone know a workaround to the problem the OP commented?

 

When I get an entity at a given index

 

 

ms = doc.ModelSpace

i = 5 # index of the entity in the drawing (Modelspace)

entObj = ms.Item(i)

 

 

I can display only few properties

 

 

for example, always for a polyline :

 

 

entObj.Layer

entObj.ObjectName

 

 

but for other properties python tells me the object has no attribute 'for example Length, Coordinates,

 

 

Instead VBA does that

 

I have the same problem.

Share this post


Link to post
Share on other sites
a_lobo

hello,

I try to execute this code :

 

 

pt = array.array('d', [0.0,0.0,0.0])

pt2 = array.array('d', [0.0,100.0,0.0])

linea =ms.AddLine(pt,pt2)and I have the follow error

 

linea =ms.AddLine(pt,pt2)

File "C:\IAcadModelSpace.py", line 281, in AddLine

ret = self._oleobj_.InvokeTypes(1581, LCID, 1, (9, 0), ((12, 1), (12, 1)),StartPoint, EndPoint)

pywintypes.com_error: (-2147352567, 'Ocurri\xf3 una excepci\xf3n.', (0, None, None, None, 0, -2147024809), None)

 

Could you help me?

thanks,

Share this post


Link to post
Share on other sites
pravu87

Excellent post! Could you help me with a small problem? I have to MOVE AND ROTATE the coordinates of a certain polyline and I would like to use Python to do that. How would the command structure look like?

Thanks in Advance!

Share this post


Link to post
Share on other sites
tgibbo

I know your post was many years ago. Are you still using Python?

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...