// 导出至STL void OnExportSTLActFn() { /*if (!QuickCheckValidLicense(SMART_PROFESSIONAL)) return;*/ AFX_MANAGE_STATE(AfxGetStaticModuleState()); DestroyAllDialog(); CancelSelectDialog(); Sleep(50); // 第1步:检查当前模型环境 ProMdl pMdl = GetCurrentMdl(); if (pMdl == NULL) { MessageBox(NULL, L"当前环境未发现模型!", L"提示", MB_OK|MB_ICONWARNING); return; } // 选取面组 vector<ProSelection> arrSelQlt; if (SelectObject(arrSelQlt, "dtmqlt")) { ProName mdlName; ProMdlNameGet(pMdl, mdlName); CString strMdlName(mdlName); ProFileName filename; wcsncpy_s(filename, PRO_FILE_NAME_SIZE, strMdlName, _TRUNCATE); // 选择保存位置 ProPath stlpath; if (ProFileSave(NULL, L"*.stl", NULL, NULL, NULL, filename, stlpath) == PRO_TK_NO_ERROR) { CString strStlPath(stlpath); ProGeomitem qltitem; ProSelectionModelitemGet(arrSelQlt[0], &qltitem); ProQuilt quilt; ProGeomitemToQuilt(&qltitem, &quilt); vector<ProSurface> arrSurfs; ProQuiltSurfaceVisit(quilt, QuiltSurfacesGetAction, NULL, &arrSurfs); vector<ProGeomitem> arrSurfsItems; for (int i=0; i<(int)arrSurfs.size(); i++) { ProGeomitem srfitem; ProSurfaceToGeomitem(ProMdlToSolid(pMdl), arrSurfs[i], &srfitem); arrSurfsItems.push_back(srfitem); } if (ExportStl(arrSurfsItems, strStlPath, 0.5, 1.0)) { MessageBox(NULL, L"导出stl成功", L"提示", MB_OK); } else MessageBox(NULL, L"导出stl失败", L"提示", MB_OK|MB_ICONWARNING); } } InvalidateDrawing(); ProMessageClear(); }
ProError CSDMdlSpecAsmRefCheck::AsmMdlVisitAction(ProFeature *pFea, ProError status, ProAppData pData) { UNUSED_ALWAYS(status); AsmRefVisitData &visitData = *((AsmRefVisitData *)pData); ProAsmcompconstraint* pArrCons = NULL; if (ProAsmcompConstraintsGet(pFea, &pArrCons) == PRO_TK_NO_ERROR) { int nCount; ProArraySizeGet(pArrCons, &nCount); for (int i=0; i<nCount; i++) { ProAsmcompConstrType type; ProAsmcompconstraintTypeGet(pArrCons[i], &type); if (type != PRO_ASM_CSYS) { ProMdl pMdl = NULL; ProAsmcompMdlGet(pFea, &pMdl); ProName name; ProMdlNameGet(pMdl, name); visitData.nResultType = CHECK_RESULT_INVALID_VALUE; visitData.arrMdlNames.Add(CString(name)); visitData.arrErrorIDs.Add(pFea->id); break; } } ProArrayFree((ProArray*)&pArrCons); } else { ProMdl pMdl = NULL; ProAsmcompMdlGet(pFea, &pMdl); ProName name; ProMdlNameGet(pMdl, name); visitData.nResultType = CHECK_RESULT_INVALID_VALUE; visitData.arrMdlNames.Add(CString(name)); visitData.arrErrorIDs.Add(pFea->id); } return PRO_TK_NO_ERROR; }
int CSDMdlAttrMdlNameCheck::CheckAction(void *pData, const CheckRule &checkRule, CheckResult &checkResult) { ProMdl pMdl = (ProMdl)pData; if (NULL == pMdl) { checkResult.nResultType = CHECK_RESULT_INVALID_MODEL; return checkResult.nResultType; } if (!IsMdlTypeValid(pMdl, checkRule.dwMdlFilter)) { checkResult.nResultType = CHECK_RESULT_INVALID_MODEL; return checkResult.nResultType; } // 检查输入值有效性 if (checkRule.arrRuleContent.GetCount() < 2) { checkResult.nResultType = CHECK_RESULT_INVALID_INPUT; return checkResult.nResultType; } ProError status; ProName CheckedMdlName; status = ProMdlNameGet(pMdl,CheckedMdlName); CString strMdlNameCheckType; CString strCheckContent; CString strCheckedMdlName = CheckedMdlName; strMdlNameCheckType = checkRule.arrRuleContent[0]; strCheckContent = checkRule.arrRuleContent[1]; //转换成大写字母 strCheckContent.MakeUpper(); strCheckedMdlName.MakeUpper(); int nIndex; nIndex = strCheckedMdlName.Find(strCheckContent); if (strMdlNameCheckType.CompareNoCase(L"包含") == 0 && nIndex != -1) { checkResult.nResultType = CHECK_RESULT_NO_ERROR; return CHECK_RESULT_NO_ERROR; } else if (strMdlNameCheckType.CompareNoCase(L"不包含") == 0 && nIndex == -1) { checkResult.nResultType = CHECK_RESULT_NO_ERROR; return CHECK_RESULT_NO_ERROR; } checkResult.nResultType = CHECK_RESULT_INVALID_VALUE; return CHECK_RESULT_INVALID_VALUE; }
ProError CSDMdlSpecAsmImplicitCheck::AsmMdlVisitAction(ProFeature *pFea, ProError status, ProAppData pData) { UNUSED_ALWAYS(status); AsmImplicitVisitData &visitData = *((AsmImplicitVisitData *)pData); ProFeatStatus featStatus; ProFeatureStatusGet(pFea, &featStatus); if (featStatus == PRO_FEAT_SUPPRESSED) { ProMdl pMdl = NULL; ProAsmcompMdlGet(pFea, &pMdl); ProName name; ProMdlNameGet(pMdl, name); visitData.nResultType = CHECK_RESULT_ERROR_VALUE; visitData.arrMdlNames.Add(CString(name)); visitData.arrErrorIDs.Add(pFea->id); } return PRO_TK_NO_ERROR; }
// 生成包覆体 void OnCreateBodyActFn() { /*if (!QuickCheckValidLicense(SMART_PROFESSIONAL)) return;*/ AFX_MANAGE_STATE(AfxGetStaticModuleState()); DestroyAllDialog(); CancelSelectDialog(); Sleep(50); // 检查当前模型环境 ProMdl pMdl = GetCurrentMdl(); if (pMdl == NULL) { MessageBox(NULL, L"当前环境未发现模型!", L"提示", MB_OK|MB_ICONWARNING); return; } ProMdlType typeMdl; ProMdlTypeGet(pMdl, &typeMdl); if (typeMdl != PRO_MDL_ASSEMBLY) { MessageBox(NULL, L"该功能仅在装配环境下有效!", L"提示", MB_OK|MB_ICONWARNING); return; } //ExportElemTreeXML(); // 选择一个面组 vector<ProSelection> arrSelQlt; ShowMessageTip(L"Tips.选择要加厚的包覆面..."); if (SelectObject(arrSelQlt, "dtmqlt")) { // 输入整体加厚值 double dThickValue; ShowMessageTip(L"指定厚度值,不能为0,负值表示向内加厚:"); if (ProMessageDoubleRead(NULL, &dThickValue) == PRO_TK_NO_ERROR) { // 创建发布几何 int nPubFeatID = CreatePublishGeom(pMdl, arrSelQlt[0]); ProName nameAsm; ProMdlNameGet(pMdl, nameAsm); CString strNamePart = nameAsm; ProName namePart; for (int i=101; ;i++) { CString strTemp; strTemp.Format(L"%s_%d", nameAsm, i); wcsncpy_s(namePart, PRO_NAME_SIZE, strTemp, _TRUNCATE); ProMdl pMdlTemp; if (ProMdlInit(namePart, PRO_MDL_PART, &pMdlTemp) == PRO_TK_E_NOT_FOUND) break; } // 新建一个零件 ProAsmcomp compPart; ProAsmcompCreateCopy(ProMdlToAssembly(pMdl), namePart, PRO_MDL_PART, NULL, PRO_B_FALSE, &compPart); //ProSolidRegenerate(pMdl); ProMdl pMdlPart; ProAsmcompMdlGet(&compPart, &pMdlPart); ProModelitem itemAsm; ProMdlToModelitem(pMdl, &itemAsm); ProSelection selAsm; ProSelectionAlloc(NULL, &itemAsm, &selAsm); ProFeature featPub; featPub.id = nPubFeatID; featPub.owner = pMdl; featPub.type = PRO_FEATURE; ProSelection selPubFeat; ProSelectionAlloc(NULL, &featPub, &selPubFeat); // 创建复制几何 ProModelitem itemCopyQuilt; CreateCopyGeom(pMdlPart, selAsm, selPubFeat, itemCopyQuilt); ProSelection selCopyQuilt; ProSelectionAlloc(NULL, &itemCopyQuilt, &selCopyQuilt); // 弹出提示:是否要对单个面设置厚度 if (MessageBox(NULL, L"是否要对单个面设置厚度", L"提示", MB_YESNO|MB_ICONQUESTION) == IDYES) { ProMdlDisplay(pMdlPart); int nWndIDPart; ProMdlWindowGet(pMdlPart, &nWndIDPart); ProWindowActivate(nWndIDPart); // 弹出对话框 if (g_pDlgThick != NULL) { if (g_pDlgThick->GetSafeHwnd() != NULL) g_pDlgThick->DestroyWindow(); SAFE_DELETE_POINTER(g_pDlgThick); } g_pDlgThick = new CDlgSetThick(); g_pDlgThick->InitSurfData(pMdl, selCopyQuilt, dThickValue); g_pDlgThick->Create(IDD_DLG_SETTHICK); g_pDlgThick->ShowWindow(SW_SHOW); } else { ThickQuilt(pMdlPart, selCopyQuilt, dThickValue); } } } InvalidateDrawing(); ProMessageClear(); }
ProError visit_component_action( ProFeature* in_feature, ProError in_status, Appdata in_app_data ) { ProError rs; ProMdl model; switch( rs = ProAsmcompMdlGet(in_feature, &model) ) { case PRO_TK_NO_ERROR: break; case PRO_TK_BAD_INPUTS: isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << "The specified feature is not a valid component feature."; return PRO_TK_GENERAL_ERROR; case PRO_TK_E_NOT_FOUND: isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << "Assembly component model is not a solid or is not in memory."; return PRO_TK_GENERAL_ERROR; default: isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << "unexpected error: " << rs; return PRO_TK_GENERAL_ERROR; } ProSolid solid = static_cast<ProSolid>(model); ProMdlType component_type; switch( rs = ProMdlTypeGet(model, &component_type) ) { case PRO_TK_NO_ERROR: break; case PRO_TK_BAD_INPUTS: isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << "The input argument is invalid."; return PRO_TK_GENERAL_ERROR; case PRO_TK_GENERAL_ERROR: isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << "The information could not be obtained."; return PRO_TK_GENERAL_ERROR; default: isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << "unexpected error: " << rs; return PRO_TK_GENERAL_ERROR; } ProAsmcomp component = static_cast<ProAsmcomp>(*in_feature); Appdata app_data; app_data.level = in_app_data.level+1; app_data.path.owner = static_cast<ProSolid>(component.owner); app_data.path.owner = in_app_data.path.owner; app_data.path.table_num = in_app_data.path.table_num + 1; for( int ix=0; ix < app_data.path.table_num; ++ix ) { app_data.path.comp_id_table[ix] = in_app_data.path.comp_id_table[ix]; } app_data.path.comp_id_table[app_data.path.table_num] = in_feature->id; switch( component_type ) { case PRO_ASSEMBLY: { ProAppData* app_data_vp = reinterpret_cast<ProAppData*>(&app_data); switch( rs = ProSolidFeatVisit(solid, visit_action, filter_action, app_data_vp) ) { case PRO_TK_NO_ERROR: break; case PRO_TK_E_NOT_FOUND: isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << "filter produced no component features."; break; default: isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << "Any other value is the value returned " << " by the action function (visiting stopped)." << rs; } } break; case PRO_PART: { ProMdl self; switch( rs = ProModelitemMdlGet(in_feature, &self) ) { case PRO_TK_NO_ERROR: break; case PRO_TK_BAD_INPUTS: isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << "feature has no model. " << in_feature->id; } char assembly_name[PRO_NAME_SIZE]; { ProName wname; switch( rs = ProMdlNameGet(self, wname) ) { case PRO_TK_NO_ERROR: break; case PRO_TK_BAD_INPUTS: isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << "The input argument is invalid. " << in_feature->id; throw std::runtime_error("selector feature name failed"); case PRO_TK_E_NOT_FOUND: isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << "The specified item does not have a name. "; break; default: isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << "ill specified error: " << rs; throw std::runtime_error("selector feature name failed"); } ProWstringToString(assembly_name, wname); } char model_name[PRO_PATH_SIZE]; { wchar_t* wname; ProBoolean is_modifiable; switch( rs = ProMdlCommonnameGet(self, &wname, &is_modifiable) ) { case PRO_TK_NO_ERROR: break; case PRO_TK_BAD_INPUTS: isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << "The input argument is invalid. " << in_feature->id; throw std::runtime_error("selector feature name failed"); case PRO_TK_E_NOT_FOUND: isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << "The specified item does not have a name. "; break; default: isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << "ill specified error: " << rs; throw std::runtime_error("selector feature name failed"); } ProWstringToString(model_name, wname); ProWstringFree(wname); } char item_name[PRO_NAME_SIZE]; { ProName wname; switch( rs = ProModelitemNameGet(in_feature, wname) ) { case PRO_TK_NO_ERROR: break; case PRO_TK_BAD_INPUTS: isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << "The input argument is invalid. " << in_feature->id; throw std::runtime_error("selector feature name failed"); case PRO_TK_E_NOT_FOUND: isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << "The specified item does not have a name. "; break; default: isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << "ill specified error: " << rs; throw std::runtime_error("selector feature name failed"); } ProWstringToString(item_name, wname); } // If you request the transformation from the member to the // assembly, this is PRO_B_TRUE. Otherwise, this is PRO_B_FALSE. ProBoolean bottom_up = PRO_B_TRUE; ProMatrix transformation; // retrieve the transformation matrix, given the component path. switch( rs = ProAsmcomppathTrfGet(&app_data.path, bottom_up, transformation) ) { case PRO_TK_NO_ERROR: break; case PRO_TK_BAD_INPUTS: isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << "transform get, the input argument is invalid: " << app_data.path.comp_id_table; return PRO_TK_GENERAL_ERROR; case PRO_TK_GENERAL_ERROR: isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << "The specified component path was wrong, or contained missing members."; return PRO_TK_GENERAL_ERROR; default: isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << "unexpected error: " << rs; return PRO_TK_GENERAL_ERROR; } isis_LOG(lg, isis_FILE, isis_INFO) << "transformation: " << assembly_name << " : " << model_name << " : " << item_name; isis_LOG(lg, isis_FILE, isis_INFO) << "["; for( int ix=0; ix < 4; ++ix ) { isis_LOG(lg, isis_FILE, isis_INFO) << "\n\t["; for( int jx=0; jx < 4; ++jx ) { isis_LOG(lg, isis_FILE, isis_INFO) << '\t' << transformation[ix][jx]; } isis_LOG(lg, isis_FILE, isis_INFO) << "]"; } isis_LOG(lg, isis_FILE, isis_INFO) << "]\n"; return PRO_TK_NO_ERROR; } default: { isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << "unknown-component-type: " << component_type; } } return PRO_TK_NO_ERROR; }