需要理解的知识
* com组件原理及应用
1. IUnknown , IDiapatch ...
2. 接口的指针指向接口这个结构,接口里面保存一个虚函数表指针,指向接口里的函数。
3. 接口的使用
+ 通过queryInterface (必须是同一个组件)
+ 通过上一级接口的方法得到
+ 通过某些某些接口的方法得到
SOLIDWORKS环境配置
安装apisdk 后 打开vs新建工程时会有向导可以新建solidworks项目
新建后需要配置下项目:
编译这个模板项目会出现
继续编译完成。 编译时需要关闭solidworks
注意!! 直接用solidrorks打开生成的dll会注册失败,编译成dll后,需要注册到注册表 才能被使用。
需要用管理员身份注册
接口也可以通过api文档下面这个提示来知道怎么获取
第一个项目
既然都已经有模板项目了,再在这个模板项目上进行修改就可以了。
- 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;
}
- 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"这是个零件");
}
有时候需要像下面这样用
下面这样是错误的
而且下面这种也是可以的, 注释的是不可以的编译不过。
这里一定要置空,不然会死循环,next函数不会帮你置空。
事件
调用IGetRefAxisParams()前不要select轴,不然会调用失败导致获取不了轴得两个端点
solidworks二次开发问题解决:
1.打开dll无法启动插件,此时需要注册插件才能打开。
2.需要什么什么.140msu.lib这种都是工具集不匹配问题,改项目配置文件,改成自己的工具集。
3.关于需要把VBA的代码转成C++的代码
可以先把功能录制下来,比如 需要用C++实现创建边线法兰特征,效果如下
- 3.1 边线法兰的创建需要 手动选择一条边,并创建法兰需要的参考草绘,设置好折弯半径,法兰长度即可。
- 3.2 录制宏后发现没有没有有用的代码。
- 3.3 此时只能通过查看api文档找到 边线法兰的函数
- 查看对应的vba实现
- 执行此代码,创建成功,转成成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);