Access Assembly Example (C++ COM)
This example shows how to open, explode and collapse, and create a drawing
of an assembly. It also shows how to traverse the FeatureManager design
tree, get a component, and suppress and resolve that component. This example
uses CComPtr Smart_Pointers.htm and CComBSTR smart types.
DemoAssemblies.cpp: application code
///////////////////////////////////////////////////////////////////////
//
// Preconditions: ujoint.sldasm
exists in the specified folder and
// contains
a component named bracket-1.
//
//
// Postconditions: None
//
// NOTE: Scroll
down see the code for the stdafx.h
header file.
//
///////////////////////////////////////////////////////////////////////
#include "stdafx.h"
VARIANT_BOOL retVal = VARIANT_FALSE;
HRESULT hres = NOERROR;
//Function prototypes
void OpenAssembly(ISldWorks* swApp, IModelDoc2** swModel);
void TraverseFeatureManagerDesignTree(IModelDoc2* swModel,
IComponent2** swComponent);
void SuppressSelectedComponent(IComponent2* swComponent,
ISldWorks* swApp);
void ResolveSelectedComponent(IComponent2* swComponent,
ISldWorks* swApp);
void ExplodeAssembly(IModelDoc2* swModel, IAssemblyDoc**
swAssemblyDoc);
void CollapseAssembly(IModelDoc2* swModel, IAssemblyDoc*
swAssemblyDoc);
void CreateDrawingOfAssembly(ISldWorks* swApp, IModelDoc2*
swModel);
void CloseDocuments(ISldWorks* swApp);
using namespace std;
int _tmain()
{
//Initialize COM
CoInitialize(NULL);
//Use ATL smart pointers
CComPtr<ISldWorks> swApp;
CComPtr<IModelDoc2> swModel;
CComPtr<IComponent2> swComponent;
CComPtr<IAssemblyDoc> swAssemblyDoc;
bool bDone;
do
{
try
{
//Open or attach to the currently running
instance of the sldworks.exe
//COM server on your local computer; throw
an exception if
//SOLIDWORKS is not opened or attached
to
hres = swApp.CoCreateInstance(__uuidof(SldWorks),
NULL, CLSCTX_LOCAL_SERVER);
if (hres != S_OK)
throw 0;
bDone = true;
IModelDoc2* swModel = NULL;
//Open assembly
OpenAssembly(swApp, &swModel);
IComponent2* swComponent = NULL;
//Traverse FeatureManager design tree to
get specified feature
TraverseFeatureManagerDesignTree(swModel,
&swComponent);
//Suppress selected component if it is
resolved
SuppressSelectedComponent(swComponent,
swApp);
//Resolve selected component if it is suppressed
ResolveSelectedComponent(swComponent, swApp);
IAssemblyDoc* swAssemblyDoc = NULL;
//Explode assembly
ExplodeAssembly(swModel, &swAssemblyDoc);
//Collapse exploded assembly
CollapseAssembly(swModel, swAssemblyDoc);
//Create drawing of assembly
CreateDrawingOfAssembly(swApp, swModel);
//Close documents
CloseDocuments(swApp);
}
//Catch the exception and tell the user
that SOLIDWORKS is not running
catch (int)
{
cout << "Error starting or attaching
to a SOLIDWORKS session." << endl;
//Release COM references
swApp = NULL;
swModel = NULL;
swComponent = NULL;
swAssemblyDoc = NULL;
//Uninitialize COM
CoUninitialize();
return 1;
}
}
while(!bDone);
//Release COM references
swApp = NULL;
swModel = NULL;
swComponent = NULL;
swAssemblyDoc = NULL;
//Uninitialize COM
CoUninitialize();
return 0;
}
void OpenAssembly(ISldWorks* swApp, IModelDoc2** swModel)
//Open assembly
{
CComBSTR sFileName(L"c:\\test\\universaljoint\\ujoint.sldasm");
CComBSTR sDefaultConfiguration(L"Default");
long fileerror, filewarning;
IModelDoc2* swModelAssembly;
hres = swApp->OpenDoc6(sFileName,
swDocASSEMBLY, swOpenDocOptions_Silent, sDefaultConfiguration, &fileerror,
&filewarning, &swModelAssembly);
*swModel = swModelAssembly; //Set the value
of the input argument equal to address of the interface
}
void TraverseFeatureManagerDesignTree(IModelDoc2* swModel,
IComponent2** swComponent)
// Traverse FeatureManager design tree to get the
// specified feature in FeatureManager design tree
{
//Use ATL smart pointers
CComPtr<IFeature> swFeature;
CComPtr<ISelectionMgr> swSelMgr;
CComBSTR sGetFeatureName(L"");
CComBSTR sFeatureName(L"bracket-1");
bool bFoundComponents = false;
hres = swModel->IFirstFeature(&swFeature);
// If the name of the feature is "bracket-1"
// then select the feature
do
{
hres = swFeature->get_Name(&sGetFeatureName);
if (sGetFeatureName == sFeatureName)
{
hres = swFeature->Select2(true,
1, &retVal);
hres = swModel->get_ISelectionManager(&swSelMgr);
struct IDispatch *pComponentDisp;
hres = swSelMgr->GetSelectedObject6(1,
-1, &pComponentDisp);
IComponent2* swSelectedComponent;
hres = pComponentDisp->QueryInterface(__uuidof(IComponent2),
reinterpret_cast<void**>(&swSelectedComponent));
pComponentDisp->Release();
*swComponent = swSelectedComponent; //Set
the value of the input argument equal to address of the interface
bFoundComponents = true;
}
else
//Get next feature
{
CComPtr<IFeature> swFeatureNext;
hres = swFeature->IGetNextFeature(&swFeatureNext);
swFeature.Release();
swFeature = swFeatureNext;
}
}while ( !bFoundComponents);
}
void SuppressSelectedComponent(IComponent2* swComponent,
ISldWorks* swApp)
//Suppress selected component if it is resolved
{
CComBSTR messageSuppressed (L"Component
is already suppressed.");
long lComponentSuppressState;
long lSuppressMessageResult;
long lSuppressError;
hres = swComponent->GetSuppression(&lComponentSuppressState);
if (lComponentSuppressState == swComponentSuppressed)
hres = swApp->SendMsgToUser2(messageSuppressed,
swMbInformation, swMbOk, &lSuppressMessageResult);
else
hres = swComponent->SetSuppression2(swComponentSuppressed,
&lSuppressError);
}
void ResolveSelectedComponent(IComponent2* swComponent,
ISldWorks* swApp)
//Resolve selected component if it is suppressed
{
CComBSTR messageResolved (L"Component
is already resolved.");
long lComponentResolveState;
long lResolveMessageResult;
long lResolveError;
hres = swComponent->GetSuppression(&lComponentResolveState);
if (lComponentResolveState == swComponentFullyResolved)
hres = swApp->SendMsgToUser2(messageResolved,
swMbInformation, swMbOk, &lResolveMessageResult);
else
hres = swComponent->SetSuppression2(swComponentFullyResolved,
&lResolveError);
}
void ExplodeAssembly(IModelDoc2* swModel, IAssemblyDoc**
swAssemblyDoc)
//Explode assembly
{
CComPtr<IModelView> swExplodeModelView;
double dZoomFactorOut = 0.3;
IAssemblyDoc* swThisAssemblyDoc;
hres = swModel->get_IActiveView(&swExplodeModelView);
hres = swExplodeModelView->ZoomByFactor(dZoomFactorOut);
hres = swModel->QueryInterface(__uuidof(IAssemblyDoc),
reinterpret_cast<void**>(&swThisAssemblyDoc));
hres = swThisAssemblyDoc->AutoExplode(&retVal);
*swAssemblyDoc = swThisAssemblyDoc;
}
void CollapseAssembly(IModelDoc2* swModel, IAssemblyDoc*
swAssemblyDoc)
//Collapse assembly
{
hres = swAssemblyDoc->AutoExplode(&retVal);
hres = swAssemblyDoc->ViewCollapseAssembly();
hres = swModel->ViewZoomtofit2();
}
void CreateDrawingOfAssembly(ISldWorks* swApp, IModelDoc2*
swModel)
//Create a drawing of the assembly
{
CComPtr<IModelDoc2> swNewModel;
CComPtr<IModelDocExtension> swModelDocExt;
CComPtr<IDrawingDoc> swDrawingDoc;
CComBSTR sDrawingDocTemplate (L"c:\\Program
Files\\SOLIDWORKS\\data\\templates\\Drawing.drwdot");
CComBSTR sActiveAssembly (L"c:\\test\\universaljoint\\ujoint.sldasm");
CComBSTR sDrawingDocName (L"ujoint
- Sheet1");
double dWidth = 0.2794;
double dHeight = 0.4318;
long lPaperSize = 2;
long lWindowStyle = 2;
long lErrorActivatingDoc;
hres = swApp->INewDocument2(sDrawingDocTemplate,
lPaperSize, dWidth, dHeight, &swNewModel);
swDrawingDoc = swNewModel;
hres = swApp->ArrangeWindows(lWindowStyle);
hres = swModel->Release();
hres = swApp->IActivateDoc3(sActiveAssembly,
false, &lErrorActivatingDoc, &swModel);
hres = swModel->get_Extension(&swModelDocExt);
hres = swModelDocExt->SelectByID2(sActiveAssembly,
L"COMPONENT", 0.0, 0.0, 0.0, VARIANT_FALSE, 0, NULL, swSelectOptionDefault,
&retVal);
swNewModel.Release();
hres = swApp->IActivateDoc3(sDrawingDocName,
false, &lErrorActivatingDoc, &swNewModel);
hres = swDrawingDoc->Create3rdAngleViews(sActiveAssembly,
&retVal);
}
void CloseDocuments(ISldWorks* swApp)
//Close assembly and drawing documents
{
swApp->CloseAllDocuments(true,
&retVal);
}
stdafx.h: header file
//////////////////////////////////////////////////////////////////////
//
//stdafx.h: include file for standard system include files,
// or project-specific include files that are used frequently,
but
// are changed infrequently
//
//////////////////////////////////////////////////////////////////////
#pragma once
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff
from Windows headers
#include <stdio.h>
#include <tchar.h>
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString
constructors will be explicit
#include <windows.h>
#include <atlbase.h> //Microsoft's ATL helper classes
#include <iostream>
using namespace std; //Use
the standard C++ libraries for text output.
#import "sldworks.tlb" raw_interfaces_only,
raw_native_types, no_namespace, named_guids //the
SOLIDWORKS type library
#import "swconst.tlb" raw_interfaces_only,
raw_native_types, no_namespace, named_guids //the
SOLIDWORKS constant type library
// TODO: reference additional headers your program requires
here