C language > Work in progress

Pelles-C + OLE for access to AutoCAD

<< < (2/11) > >>

sergey:
Yes, but ...  so:
To create a point, use the AddPoint method.
-------------------------------------------
Creates a Point object at a given location.
Signature
---------
RetVal = object.AddPoint(Point)
Object
------
ModelSpace Collection, PaperSpace Collection, Block
The object or objects this method applies to.
Point
-----
Variant (three-element array of doubles); input-only
The coordinates of the point to be created.
RetVal
------
Point object - The newly created Point object.

Sub Example_AddPoint()
    ' This example creates a point in model space.
    Dim pointObj As AcadPoint
    Dim location(0 To 2) As Double
   
    ' Define the location of the point
    location(0) = 5#: location(1) = 5#: location(2) = 0#
   
    ' Create the point
    Set pointObj = ThisDrawing.ModelSpace.AddPoint(location)
    ZoomAll
   
End Sub

sergey:
Add some code ProgeCAD:

--- Code: ---   IDispatch *pAddPnts = NULL;
   {
VARIANT result;
VariantInit(&result);
VARIANT parm1, parm2;
parm1.vt = VT_DISPATCH; parm1.pdispVal = pPoint1;
parm2.vt = VT_DISPATCH; parm2.pdispVal = pPoint2;
AutoWrap(DISPATCH_PROPERTYGET | DISPATCH_METHOD, &result, pModelSpace, L"AddPointEntity", 1, parm1);
AutoWrap(DISPATCH_PROPERTYGET | DISPATCH_METHOD, &result, pModelSpace, L"AddPointEntity", 1, parm2);
pAddPnts = result.pdispVal;
   }
--- End code ---

2 small 'Points' on ends of the 'Line':

TimoVJL:
I think in older IntelliCAD (<7)/progeCAD uses Library.CreatePoint result Point only as location for other functions.
AutoCAD use Utility.CreateTypedArray Point1, vbDouble, 0,0,0 for creating array of 3 doubles for same purpose.

sergey:
1. AutoCAD plases in Windows-registry ONLY 'CLSID_AcadApplication'
   but to programming AutoCAD you need also (as minimum) 2 objects:
   CLSID_AcadDocument
   CLSID_AcadModelSpace
   wich missing (not presents) in Windows-registry.

2. Script-lang Python has module named 'comtypes-1.1.2',
   wich helpfully connect to AutoCAD and programmin it.
   https://github.com/enthought/comtypes/releases

3. sample-code Python (ver.2.7):

--- Code: ---   c:\cmd.exe python
   import array
   import comtypes.client
   #Get running instance of the AutoCAD application
   app = comtypes.client.GetActiveObject("AutoCAD.Application")
   #Get the ModelSpace object
   ms = app.ActiveDocument.ModelSpace
   #Add a POINT in ModelSpace
   pt = array.array('d', [0,0,0])
   point = ms.AddPoint(pt)
   #Add a LINE in ModelSpace
   pt1 = array.array('d', [1.0,1.0,0])
   pt2 = array.array('d', [2.0,2.0,0])
   line = ms.AddLine(pt1, pt2)

--- End code ---
4. Roman Haritonov wrote Python-application
   https://github.com/reclosedev/pyautocad
   http://readthedocs.org/docs/pyautocad
   to 'manage' AutoCAD by 'comtypes-1.1.2':
   pyautocad.api: api.py types.py utils.py compat.py cache.py tables.py
   
5. Thomas Heller wrote by MS-VisuaStudio 'comtypes-1.1.2' (in 2005--2015)
   https://github.com/enthought/comtypes
   https://pypi.python.org/pypi/comtypes
   comtypes-1.1.2.zip\comtypes-1.1.2\source\ has 2 files:
   AvmcIfc.tlb and AvmcIfc.dll
   to enable write C/C++ applications for COM-OLE Automation,
   that enable also programming AutoCAD.

TimoVJL:
Quite awful with C >:(

--- Code: ---#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#define INITGUID
#include <ole2.h>

#define COBJMACROS
#define __AutoCAD_INCLUDEALIAS
typedef DWORD OLE_COLOR;
//line 3197: //typedef INT64 LONG_PTR ; /// allready in basetsd.h
//#include "acax17enu.h" // from acax18enu.tlb
#include "acad.h"

#pragma comment(lib, "ole32.lib")
#pragma comment(lib, "oleaut32.lib")

char *szAppName = "AutoCadTest";

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
HRESULT hr;
CLSID clsid;
IUnknown *pUnk = NULL;
IAcadApplication *pACad = NULL;
IAcadDocument *pACadDoc = NULL;
IAcadUtility* pUtility = NULL;
IAcadDatabase *pDataBase = NULL;
IAcadModelSpace *pModelSpace = NULL;

CoInitialize(NULL);
hr = CLSIDFromProgID(L"AutoCAD.Application", &clsid);
hr = GetActiveObject(&clsid, NULL, (IUnknown **)&pUnk);
if (pUnk) hr = pUnk->lpVtbl->QueryInterface(pUnk, &IID_IAcadApplication, (void **)&pACad);
if (!pACad) hr = CoCreateInstance(&clsid, NULL, CLSCTX_ALL, &IID_IAcadApplication, (void **)&pACad);
if (pACad) {
IAcadApplication_put_Visible(pACad, -1);
IAcadApplication_get_ActiveDocument(pACad, &pACadDoc);
if (pACadDoc) {
IAcadDocument_get_Utility(pACadDoc, &pUtility);
IAcadDocument_get_Database(pACadDoc, &pDataBase);
if (pDataBase) {
IAcadDatabase_get_ModelSpace(pDataBase, &pModelSpace);
if (pModelSpace) {
IAcadLine *pLine;
VARIANT vpt1, vpt2; // for points
SAFEARRAY sarray1, sarray2; // for arrays
SAFEARRAYBOUND sab1[1], sab2[1];
sab1[0].lLbound = 0; sab1[0].cElements = 3;
sab2[0].lLbound = 0; sab2[0].cElements = 3;

VARIANT parm1[3], parm2[3];
parm1[0].vt = VT_R8; parm1[0].dblVal = 0.0; // X
parm1[1].vt = VT_R8; parm1[1].dblVal = 0.0; // Y
parm1[2].vt = VT_R8; parm1[2].dblVal = 0.0; // Z
parm2[0].vt = VT_R8; parm2[0].dblVal = 100.0; // X
parm2[1].vt = VT_R8; parm2[1].dblVal = 100.0; // Y
parm2[2].vt = VT_R8; parm2[2].dblVal = 0.0; // Z

sarray1.cDims = 1;
sarray1.fFeatures = FADF_VARIANT | FADF_HAVEVARTYPE | FADF_FIXEDSIZE | FADF_STATIC;
sarray1.cbElements = sizeof(VARIANT);
sarray1.cLocks = 0;
sarray1.pvData = &parm1;
sarray1.rgsabound[0].lLbound = 0;
sarray1.rgsabound[0].cElements = 3;

sarray2.cDims = 1;
sarray2.fFeatures = FADF_VARIANT | FADF_HAVEVARTYPE | FADF_FIXEDSIZE | FADF_STATIC;
sarray2.cbElements = sizeof(VARIANT);
sarray2.cLocks = 0;
sarray2.pvData = &parm2;
sarray2.rgsabound[0].lLbound = 0;
sarray2.rgsabound[0].cElements = 3;

IAcadUtility_CreateTypedArray(pUtility, &vpt1, VT_R8, &sarray1);
IAcadUtility_CreateTypedArray(pUtility, &vpt2, VT_R8, &sarray2);

IAcadModelSpace_AddLine(pModelSpace, vpt1, vpt2, &pLine);
if (pLine) {
MessageBox(0,"Line",0,0);
} else MessageBox(0,"No Line",0,0);
}
}
}
IAcadApplication_Release(pACad);
} else
MessageBox(0, "No AutoCAD.Application ?", szAppName, MB_OK);
CoUninitialize();
return 0;
}
--- End code ---

Navigation

[0] Message Index

[#] Next page

[*] Previous page

Go to full version