Using AutoCAD via OLE works.
However, there is a problem regarding an argument which is of type VT_VARIANT and needs to be an
array of three VT_R8 values.
Case in question: addCircle(center,radius), the online documentation for this method is at:
<https://help.autodesk.com/view/OARX/2022/ENU/?guid=GUID-837C702F-91A7-445B-8713-3099B94664BE>.
This reference also depicts a VBA and a Lisp program that uses this method.
The following ooRexx program tries to use the addCircle() method, but unfortunately does not work,
an OLE error 80070057 (wrong argument) gets raised:
say "... creating AutoCAD.Application"
myApp = .oleobject~new("AutoCAD.Application")
myApp~visible = .true -- show window
myDwg = myApp~ActiveDocument
say "myDwg~name:" myDwg~name
Space = myDwg~ModelSpace -- space to draw
say "space~name:" space~name
center=(0,0,0) -- array for center point
radius=5.7
res=space~addCircle(center,radius) -- <-- does not work
myApp~quit
---
When using OLEObject to learn about the published interfaces to "space" (a model space) yields the
following type information for AddCircle:
Using both information, the AutoCAD and the OLEObject supplied one, I tried to use OLEVariant to
cast the Center argument as:
* Rexx array as: VT_ARRAY,VT_R8
* Rexx arrayas: VT_VARIANT,VT_ARRAY
Then creating OLEVariants of type VT_R8 for the center coordinates (x,y,z) and storing them in a
Rexx array and then cast again as above, to no avail.
Also casting Radius to VT_R8 and combining the invocations with all the above
casts.
All attempts yield the OLE error 80070057.
(Originally left out the third param argument, then explicitly supplied 'IN' to
no avail.)
Maybe I am doing something obvious wrong (the test code is at the end, followed
by its output).
Any help, any ideas appreciated!
---rony
P.S.: If you have AutoCAD you need to install the appropriate OLE support from
<https://knowledge.autodesk.com/support/autocad/downloads/caas/downloads/content/download-the-microsoft-vba-module-for-autocad.html>.
P.S.S.: Test code:
say "... creating AutoCAD.Application"
myApp = .oleobject~new("AutoCAD.Application")
say "sleeping 5 secs ..."
call SysSleep 5
myApp~visible = .true -- show window
myDwg = myApp~ActiveDocument
say "myDwg~name:" myDwg~name
Space = myDwg~ModelSpace
say "space~name:" space~name
-- call createOleInfo space, "AutoCad ModelSpace", 0
-- call createOleInfo space, "AutoCad ModelSpace", 1
center=(0,0,0)
radius=5.7
res=addCircle(space,center,radius)
say
vt8radius=.oleVariant~new(radius, "VT_R8", "IN")
vCenter=.oleVariant~new(center,"VT_VARIANT,VT_ARRAY", "IN")
res=addCircle(space,center,vt8radius)
res=addCircle(space,vCenter,radius)
res=addCircle(space,vCenter,vt8radius)
say
vCenter=.oleVariant~new(center,"VT_ARRAY,VT_R8", "IN")
res=addCircle(space,vCenter,radius)
res=addCircle(space,vCenter,vt8radius)
say
say "="~copies(70)
vtr8_0=.oleVariant~new(0,"VT_R8")
vArr=(vtr8_0, vtr8_0, vtr8_0)
varArr=.oleVariant~new(vArr, "VT_VARIANT,VT_ARRAY", "IN")
res=addCircle(space,varArr,radius)
res=addCircle(space,varArr,vt8radius)
say
vArr=(vtr8_0, vtr8_0, vtr8_0)
varArr2=.oleVariant~new(vArr, "VT_ARRAY,VT_R8", "IN")
res=addCircle(space,varArr2,radius)
res=addCircle(space,varArr2,vt8radius)
myApp~quit
::routine addCircle
use arg space, center, radius
signal on syntax
say "-"~copies(70)
say "arrived in addCircle, space:" space
info="center:"
if center~isA(.oleVariant) then info = info "oleVariant(" -
"varValue=("center~!varValue_~toString('L',',')"), varType="center~!varType_",
paramflags="center~!paramflags_ ")"
else
info=info "("center~toString('L',',')")"
say "addCircle(), center:"
say "09"x info
info="radius:"
if radius~isA(.oleVariant) then info = info "oleVariant(" -
"varValue="radius~!varValue_", varType="radius~!varType_",
paramflags="radius~!paramflags_ ")"
else
info=info radius
say "addCircle(), radius:"
say "09"x info
res=space~addCircle(center,radius)
say "addCircle(): OK!"
return res
syntax:
co=condition('obj')
say "addCircle(): syntax error raised ..."
say co~condition", line:" co~position "code:" co~code co~errortext
"msg:" co~message
say co~stackframes~makearray
return .nil
P.S.S.S.: Output of running the test code:
E:\test>rexx test.rex
... creating AutoCAD.Application
myDwg~name: Zeichnung1.dwg
space~name: *Model_Space
----------------------------------------------------------------------
arrived in addCircle, space: an OLEObject
addCircle(), center:
center: (0,0,0)
addCircle(), radius:
radius: 5.7
addCircle(): syntax error raised ...
SYNTAX, line: 66 code: 92.906 OLE error. msg: OLE exception: Code: 80070057
Source: unavailable Description: unavailable.
*-* Compiled method "UNKNOWN" with scope "OLEObject".
66 *-* res=space~addCircle(center,radius)
13 *-* res=addCircle(space,center,radius)
----------------------------------------------------------------------
arrived in addCircle, space: an OLEObject
addCircle(), center:
center: (0,0,0)
addCircle(), radius:
radius: oleVariant( varValue=5.7, varType=VT_R8, paramflags=IN )
addCircle(): syntax error raised ...
SYNTAX, line: 66 code: 92.906 OLE error. msg: OLE exception: Code: 80070057
Source: unavailable Description: unavailable.
*-* Compiled method "UNKNOWN" with scope "OLEObject".
66 *-* res=space~addCircle(center,radius)
18 *-* res=addCircle(space,center,vt8radius)
----------------------------------------------------------------------
arrived in addCircle, space: an OLEObject
addCircle(), center:
center: oleVariant( varValue=(0,0,0),
varType=VT_VARIANT,VT_ARRAY, paramflags=IN )
addCircle(), radius:
radius: 5.7
addCircle(): syntax error raised ...
SYNTAX, line: 66 code: 92.906 OLE error. msg: OLE exception: Code: 80070057
Source: unavailable Description: unavailable.
*-* Compiled method "UNKNOWN" with scope "OLEObject".
66 *-* res=space~addCircle(center,radius)
19 *-* res=addCircle(space,vCenter,radius)
----------------------------------------------------------------------
arrived in addCircle, space: an OLEObject
addCircle(), center:
center: oleVariant( varValue=(0,0,0),
varType=VT_VARIANT,VT_ARRAY, paramflags=IN )
addCircle(), radius:
radius: oleVariant( varValue=5.7, varType=VT_R8, paramflags=IN )
addCircle(): syntax error raised ...
SYNTAX, line: 66 code: 92.906 OLE error. msg: OLE exception: Code: 80070057
Source: unavailable Description: unavailable.
*-* Compiled method "UNKNOWN" with scope "OLEObject".
66 *-* res=space~addCircle(center,radius)
20 *-* res=addCircle(space,vCenter,vt8radius)
----------------------------------------------------------------------
arrived in addCircle, space: an OLEObject
addCircle(), center:
center: oleVariant( varValue=(0,0,0), varType=VT_ARRAY,VT_R8,
paramflags=IN )
addCircle(), radius:
radius: 5.7
addCircle(): syntax error raised ...
SYNTAX, line: 66 code: 92.906 OLE error. msg: OLE exception: Code: 80070057
Source: unavailable Description: unavailable.
*-* Compiled method "UNKNOWN" with scope "OLEObject".
66 *-* res=space~addCircle(center,radius)
24 *-* res=addCircle(space,vCenter,radius)
----------------------------------------------------------------------
arrived in addCircle, space: an OLEObject
addCircle(), center:
center: oleVariant( varValue=(0,0,0), varType=VT_ARRAY,VT_R8,
paramflags=IN )
addCircle(), radius:
radius: oleVariant( varValue=5.7, varType=VT_R8, paramflags=IN )
addCircle(): syntax error raised ...
SYNTAX, line: 66 code: 92.906 OLE error. msg: OLE exception: Code: 80070057
Source: unavailable Description: unavailable.
*-* Compiled method "UNKNOWN" with scope "OLEObject".
66 *-* res=space~addCircle(center,radius)
25 *-* res=addCircle(space,vCenter,vt8radius)
======================================================================
----------------------------------------------------------------------
arrived in addCircle, space: an OLEObject
addCircle(), center:
center: oleVariant( varValue=(an OLEVariant,an OLEVariant,an
OLEVariant), varType=VT_VARIANT,VT_ARRAY, paramflags=IN )
addCircle(), radius:
radius: 5.7
addCircle(): syntax error raised ...
SYNTAX, line: 66 code: 92.906 OLE error. msg: OLE exception: Code: 80070057
Source: unavailable Description: unavailable.
*-* Compiled method "UNKNOWN" with scope "OLEObject".
66 *-* res=space~addCircle(center,radius)
32 *-* res=addCircle(space,varArr,radius)
----------------------------------------------------------------------
arrived in addCircle, space: an OLEObject
addCircle(), center:
center: oleVariant( varValue=(an OLEVariant,an OLEVariant,an
OLEVariant), varType=VT_VARIANT,VT_ARRAY, paramflags=IN )
addCircle(), radius:
radius: oleVariant( varValue=5.7, varType=VT_R8, paramflags=IN )
addCircle(): syntax error raised ...
SYNTAX, line: 66 code: 92.906 OLE error. msg: OLE exception: Code: 80070057
Source: unavailable Description: unavailable.
*-* Compiled method "UNKNOWN" with scope "OLEObject".
66 *-* res=space~addCircle(center,radius)
33 *-* res=addCircle(space,varArr,vt8radius)
----------------------------------------------------------------------
arrived in addCircle, space: an OLEObject
addCircle(), center:
center: oleVariant( varValue=(an OLEVariant,an OLEVariant,an
OLEVariant), varType=VT_ARRAY,VT_R8, paramflags=IN )
addCircle(), radius:
radius: 5.7
addCircle(): syntax error raised ...
SYNTAX, line: 66 code: 92.906 OLE error. msg: OLE exception: Code: 80070057
Source: unavailable Description: unavailable.
*-* Compiled method "UNKNOWN" with scope "OLEObject".
66 *-* res=space~addCircle(center,radius)
38 *-* res=addCircle(space,varArr2,radius)
----------------------------------------------------------------------
arrived in addCircle, space: an OLEObject
addCircle(), center:
center: oleVariant( varValue=(an OLEVariant,an OLEVariant,an
OLEVariant), varType=VT_ARRAY,VT_R8, paramflags=IN )
addCircle(), radius:
radius: oleVariant( varValue=5.7, varType=VT_R8, paramflags=IN )
addCircle(): syntax error raised ...
SYNTAX, line: 66 code: 92.906 OLE error. msg: OLE exception: Code: 80070057
Source: unavailable Description: unavailable.
*-* Compiled method "UNKNOWN" with scope "OLEObject".
66 *-* res=space~addCircle(center,radius)
39 *-* res=addCircle(space,varArr2,vt8radius)
E:\test>