PDA

View Full Version : On Python for autocad



elmasea
1st Jun 2010, 08:03 pm
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

Lee Mac
1st Jun 2010, 09:30 pm
You might find more interest in Python here (http://www.theswamp.org/index.php)...

Enjoy,

Lee

elmasea
18th Jul 2010, 07:49 pm
"""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 "<<<<<<<<<< End >>>>>>>>>>>"

lode
4th Oct 2010, 05:04 pm
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

Jeff H
13th Oct 2010, 10:51 pm
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#

Hioushi
6th Nov 2010, 03:23 am
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.