1、创建工程,选择ATL COM AppWizard__Support MFC
2、Insert----New ATL Object------swAddIn
3、StringTable: 三行添加ID
4、在AddMenu中 添加如下代码:
//遍历零件的面
position = -1;
menu.LoadString(IDS_PART_FACE_ITEM);
method.LoadString(IDS_PART_FACE_METHOD);
hint.LoadString(IDS_PART_FACE_HINT);
m_iSldWorks->AddMenuItem2(type, m_swCookie, menu, position, method, update, hint, &ok);
5、添加自定义方法: 右键单击Iswobj10后,选中Insert Method
6、如下是实现代码
STDMETHODIMP Cswobj10::bianli_face()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: Add your implementation code here
CComPtr<IModelDoc2> pModelDoc;
CComPtr<IFeature> pFeature;
CString total_string;
long doctype=-1; //文档类型
HRESULT hr;
hr=m_iSldWorks->get_IActiveDoc2(&pModelDoc);
if(hr!=S_OK){
AfxMessageBox("获得当前活动文档失败");
return S_OK;}
pModelDoc->GetType(&doctype);
if(doctype!=swDocPART){
AfxMessageBox("打开的文档不是零件");
pModelDoc=NULL;
return S_OK;
}
long FaceNum; //面的数量
double Area=0; //面积
long EdgeNum=0;//边的数量
int ID=-1;
VARIANT_BOOL flag_T=VARIANT_TRUE;
VARIANT_BOOL flag_F=VARIANT_FALSE;
//遍历特征
pModelDoc->IFirstFeature(&pFeature); //第一个特征
while(pFeature){
pFeature->GetFaceCount(&FaceNum); //面的数量
CComPtr<IFace2> *FaceArr = new CComPtr<IFace2>[FaceNum];
pFeature->IGetFaces2(&FaceNum,(IFace2**)FaceArr);
for(int i=0; i<FaceNum;i++){
FaceArr[i]->SetFaceId(i+1);
FaceArr[i]->GetFaceId(&ID);
FaceArr[i]->GetArea(&Area);
FaceArr[i]->GetEdgeCount(&EdgeNum); //边的数量
FaceArr[i]->Highlight(flag_T);
Sleep(1000); //高亮显示,以判别面的次序
FaceArr[i]->Highlight(flag_F);
CString tmp;
tmp.Format("%d:面的面积: %0.3f, 面的边数:%ld\n",ID,Area*1000000,EdgeNum); //面积mm^2, 否则小数位数太多,出错
total_string+=tmp;
}
delete []FaceArr; //必须进行释放,防止引发内存泄露
FaceArr=NULL;
CComPtr<IFeature> pFeature_next;
pFeature->IGetNextFeature(&pFeature_next);//下一个特征
pFeature=NULL;
pFeature=pFeature_next;
}
pModelDoc=NULL;
AfxMessageBox(total_string);
return S_OK;
}