On 08.05.2022 20:15, Rony G. Flatscher wrote:

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>

One problem in debugging this is the lack of information how exactly ooRexx is marshalling the VT_VARIANT for the Windows peer.

For VisualBasic there is a function VarType <https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/vartype-function> that returns that kind of information. (Ad datatypes in this context maybe also interesting: <https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/data-type-summary>.)

---rony

_______________________________________________
Oorexx-devel mailing list
Oorexx-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/oorexx-devel

Reply via email to