Hello everone,
I ran into problems trying automating AutoCAD with ActivePython 2.1.1
Build 212.
What I try to do, is to pass arrays to a Com-Object in AutoCAD like:
VBA-Version:
Sub Ch3_ZoomWindow()
� ZoomWindow
MsgBox "Perform a ZoomWindow with:" & vbCrLf & "1.3, 7.8, 0" & vbCrLf
& "13.7, -2.6, 0", , "ZoomWindow"
Dim point1(0 To 2) As Double
Dim point2(0 To 2) As Double
point1(0) = 1.3: point1(1) = 7.8: point1(2) = 0
point2(0) = 13.7: point2(1) = -2.6: point2(2) = 0
ThisDrawing.Application.ZoomWindow point1, point2
End Sub
which I tried to convert into Python this way:
import win32com.client.dynamic
from win32com.client import constants,Dispatch
from win32com.client import gencache
gencache.EnsureModule('{C094C1E2-57C6-11d2-85E3-080009A0C626}', 9, 1,
1)
app = win32com.client.Dispatch("AutoCAD.Application")
print "ACAD Version is", app.Version
app.Visible = 1
app.Documents.Open("C:\Lars\A-04-01.DWG")
app.WindowState = constants.acMax
p1 = [1.3, 7.8, 0]
# p1 = 1.3, 7.8, 0.0 # doesn't work either
p2 = [13.7, -2.6,0 ]
# p2 = 13.7, -2.6, 0.0 # doesn't work either
app.ZoomWindow(p1,p2)
which results in
>>> ACAD Version is 15.0
Traceback (most recent call last):
File "C:\Lars\Python21\Pythonwin\pywin\framework\scriptutils.py",
line 301, in RunScript
exec codeObject in __main__.__dict__
File "C:\Lars\Python21\Work\AutoCAD3.py", line 20, in ?
app.ZoomWindow(p1,p2)
"C:\Lars\Python21\win32com\gen_py\C094C1E2-57C6-11D2-85E3-080009A0C626
File x9x1x1.py", line 1031, in ZoomWindow
return self._oleobj_.InvokeTypes(0x28, LCID, 1, (24, 0), ((12, 1),
(12, 1)),LowerLeft, UpperRight)
com_error: (-2147352567, 'Exception occurred.', (0, 'AutoCAD', 'Invalid
argument LowerLeft in ZoomWindow', 'C:\\Program
Files\\ACAD2000\\HELP\\OLE_ERR.HLP', -2145320939, -2147024809), None)
What am I doing wrong?
Trying to learn more about COM and Python I investigated the
testMSOffice.py from the Distribution and got another error message:
Starting Word 8 for dynamic test
Starting Word 8 for non-lazy dynamic test
Starting MSWord for generated test
Starting Excel for Dynamic test...
Traceback (most recent call last):
File "C:\Lars\Python21\win32com\test\testMSOffice.py", line 146, in
TestAll
TextExcel(xl)
File "C:\Lars\Python21\win32com\test\testMSOffice.py", line 134, in
TextExcel
xl.Cells(6,2).NumberFormat = "d/m/yy h:mm"
File "C:\Lars\Python21\win32com\client\dynamic.py", line 482, in
__setattr__
raise AttributeError, "Property '%s.%s' can not be set." %
(self._username_,
attr)
AttributeError: Property '<unknown>.NumberFormat' can not be set.
Seems to be a completely different problem but makes it hard learn from
it.
Since I don't expect, that everyone knows about the object model used
by AutoCAD I have added a paragraph about
'Using Variants for Array Data' from the 'AutoCAD 2000 ActiveX and VBA
Developer's GUide' which may give someone
with more experience a hint where my problem is.
-------------------------
Using Variants for Array Data
Variants are used to pass array data in and out of AutoCAD ActiveX
Automa-tion.
This means that your arrays must be a variant to be accepted by
AutoCAD ActiveX Automation methods and properties. In addition, array
data output from AutoCAD ActiveX Automation must be handled as a
variant.
NOTE In AutoCAD, VBA input arrays are automatically converted to
variants.
This means that you don�t have to provide a variant array as input to
the ActiveX
Automation methods and properties when using them from VBA. However,
all
the output arrays will be in the form of variants, so remember to
handle them
appropriately.
Converting Arrays to Variants
AutoCAD ActiveX Automation provides a utility method to convert an
array
of data into a variant. This method is the CreateTypedArray method,
which
creates a variant that contains an array of integers, floating numbers,
dou-bles,
and so forth. You can pass the resulting variant into any AutoCAD
method or property that accepts an array of numbers as a variant.
The CreateTypedArray method takes as input the type of values that are
in
the array, and the array of data to be converted. It returns the array
of values
as a variant. The following code converts three arrays using
CreateTypedAr-ray:
the coordinates for a spline�s fit points, and the start and end
tangent of
the spline. It then passes the variant into the AddSpline method to
create the
spline.
Creating a spline using the CreateTypedArray method
Sub Ch2_CreateSplineUsingTypedArray()
� This example creates a spline object in model space
� using the CreateTypedArray method.
Dim splineObj As AcadSpline
Dim startTan As Variant
Dim endTan As Variant
Dim fitPoints As Variant
Dim noOfPoints As Integer
Dim utilObj As Object � late bind the Utility object
Set utilObj = ThisDrawing.Utility
� Define the Spline Object
utilObj.CreateTypedArray startTan, vbDouble, 0.5, 0.5, 0
utilObj.CreateTypedArray endTan, vbDouble, 0.5, 0.5, 0
utilObj.CreateTypedArray fitPoints, vbDouble, 0, 0, 0, 5, 5, 0, 10,
0, 0
noOfPoints = 3
Set splineObj = ThisDrawing.ModelSpace.AddSpline (fitPoints,
startTan, endTan)
� Zoom in on the newly created spline
ZoomAll
End Sub
--------------------
Best regards,
Lars
_______________________________________________
ActivePython mailing list
[EMAIL PROTECTED]
http://listserv.ActiveState.com/mailman/listinfo/activepython