需要理解的知识

* com组件原理及应用
	1. IUnknown , IDiapatch  ...
	2. 接口的指针指向接口这个结构,接口里面保存一个虚函数表指针,指向接口里的函数。
	3. 接口的使用
		+ 通过queryInterface  	(必须是同一个组件)
		+ 通过上一级接口的方法得到
		+ 通过某些某些接口的方法得到

SOLIDWORKS环境配置

安装apisdk 后 打开vs新建工程时会有向导可以新建solidworks项目

新建后需要配置下项目:

win32二次开发wireshark_win32二次开发wireshark


编译这个模板项目会出现

win32二次开发wireshark_win32二次开发wireshark_02


继续编译完成。 编译时需要关闭solidworks

注意!! 直接用solidrorks打开生成的dll会注册失败,编译成dll后,需要注册到注册表 才能被使用。

需要用管理员身份注册

win32二次开发wireshark_solidworks_03


接口也可以通过api文档下面这个提示来知道怎么获取

win32二次开发wireshark_工具集_04

第一个项目

既然都已经有模板项目了,再在这个模板项目上进行修改就可以了。
  1. Add-in Callback and Enable Methods (先添加cmd cmd可以绑定工具栏和菜单)
cmdIndex0 = cmdGroup.AddCommandItem2("CreateCube", -1, "Create a cube", "Create cube", 0, "CreateCube", "EnableCube", mainItemID1, menuToolbarOption);
#Region UI Callbacks

public void CreateCube
{
    // Create Cube command code
}
public int EnableCube
{
    // Return status of the Create Cube enablement
    return 0;
}

public void ShowPMP
{
    // Show PMP command code
}
public int EnablePMP
{
    // Return status of Show PMP enablement
    return 0;
}
  1. solidwork 直接添加一个dll会自动加一个工具栏,不要试图在代码里加,加不了

    有血缘关系的接口指针 , 比如newPart() 得到的是dispatch的指针,但是实际上得到part,而part和modelDoc2有血缘关系,所以可以直接 代码如下:
CComPtr <IModelDoc2> modelDoc2Ptr;
	CComPtr <IDispatch> disPathchPtr;
	gSwApp->NewPart(&disPathchPtr);
	modelDoc2Ptr = disPathchPtr;
	long docType;
	modelDoc2Ptr->GetType(&docType);
	if (docType == swDocPART)
	{
		AfxMessageBox(L"这是个零件");
	}

有时候需要像下面这样用

win32二次开发wireshark_atl_05


下面这样是错误的

win32二次开发wireshark_solidworks_06


而且下面这种也是可以的, 注释的是不可以的编译不过。

win32二次开发wireshark_工具集_07

这里一定要置空,不然会死循环,next函数不会帮你置空。

win32二次开发wireshark_工具集_08

事件

win32二次开发wireshark_solidworks_09

调用IGetRefAxisParams()前不要select轴,不然会调用失败导致获取不了轴得两个端点

solidworks二次开发问题解决:

1.打开dll无法启动插件,此时需要注册插件才能打开。

2.需要什么什么.140msu.lib这种都是工具集不匹配问题,改项目配置文件,改成自己的工具集。

3.关于需要把VBA的代码转成C++的代码

可以先把功能录制下来,比如 需要用C++实现创建边线法兰特征,效果如下

win32二次开发wireshark_win32二次开发wireshark_10

  • 3.1 边线法兰的创建需要 手动选择一条边,并创建法兰需要的参考草绘,设置好折弯半径,法兰长度即可。
  • 3.2 录制宏后发现没有没有有用的代码。
  • 3.3 此时只能通过查看api文档找到 边线法兰的函数
  • win32二次开发wireshark_工具集_11

  • 查看对应的vba实现
  • win32二次开发wireshark_工具集_12

  • 执行此代码,创建成功,转成成C++代码如下
//法兰参考的草绘
	CComPtr<IDispatch> pDisSketch
	//插入法兰草绘  这里aComp代表模型对象,m_pDoc是当前模型的ModelDoc
	aComp.m_pDoc->InsertSketchForEdgeFlange(aEdge.m_pEdge, PI /  2, VARIANT_FALSE, &pDisSketch);
	if (pDisSketch == NULL) return false;
	//如果成功,则获取草绘特征
	CComPtr<IFeature> pSketFeat;
	pDisSketch->QueryInterface(IID_IFeature, (void**)&pSketFeat);
	//选中草绘特征,进行编辑,加入草绘线
	m_pFeat->Select2(.)
	aComp.m_pDoc->EditSketch();
	CComPtr<ISketch> pSketch = NULL;
	VARIANT_BOOL ret;
	if (aComp. m_pSketMgr->get_ActiveSketch(&pSketch) != S_OK || pSketch == NULL) return false;
	//选中边转换实体
	CSwSelection edgeSel;
	selectById2(); 
	aComp.m_pSketMgr->SketchUseEdge(VARIANT_FALSE, &ret);
	VARIANT segMents;
	pSketch->GetSketchSegments(&segMents);
	vector<CAdapt<CComQIPtr<IDispatch>>> resutlarr;
	//segMents转restlarr 
	CComPtr<ISketchLine> pLine;
	resutlarr[0]->QueryInterface(IID_ISketchLine, (void**)&pLine);
	CComPtr<ISketchPoint> pStartPt;
	CComPtr<ISketchPoint> pEndPt;
	pLine->IGetStartPoint2(&pStartPt);
	pLine->IGetEndPoint2(&pEndPt);
	//自己根据起始点增加线段
	CreateLine 省略
	//创建法兰
	VARIANT edges;
	VARIANT sket
	//省略 edges 选中的边的IEdge转成IDispatch放入
	//省略 sket   草绘pSketch转成IDispatch放入
	CComPtr<IFeature> pEdgeFlange;
	aComp.m_pFeatMgr->InsertSheetMetalEdgeFlange2(edges,	sketfeats,
		nOptions,
		dAngle,
		dRadius, (int)swFlangePositionTypeMaterialInside, dLength, (int)swSheetMetalReliefNone, 0.0, 0.0,0.0, 	(int)swFlangeDimTypeInnerVirtualSharp, NULL, &pEdgeFlange);