06-26-2021
09:01 AM
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
06-26-2021
09:01 AM
Changing an assembly fixed workplane name does not show up in 3D
I've written some code to add fixed workplanes in an assembly, offset from one of the std workplanes of that assembly.
At the end of the function I change the name of the workplane, I can see the name change in the browser, but not in the 3D View. And when I get the name in the code just to check I correctly get the newly changed name.
Is this a bug or am I doing something wrong? Here is the code:
bool AddFixedWorkPlaneInAsm (CComPtr<AssemblyComponentDefinition>& pAsmCompDef, // where the plane will be added
const int ikPlaneIdx, // Which of the standard planes to base the new one on
const double kOffsetMm, // Offset,
const wchar_t* const pszPlaneName) // Name of the newly created plane
{
gLogger.Printf (ekLogMsg,L"AFWPIA %d <%s> starting",ikPlaneIdx,pszPlaneName) ;
// Get WorkPlanes
CComPtr<WorkPlanes> pWorkPlanes ;
HRESULT hRes = pAsmCompDef->get_WorkPlanes(&pWorkPlanes);
if (FAILED(hRes)) {
ShowCOMError (hRes,L"AFWPIA, get_WorkPlanes failed") ;
return false ;
}
// Get hold of one of the WorkPlanes. Valid indices are 1 2 3 for standard workplanes
CComPtr<WorkPlane> pAsmStdWorkPlane ;
hRes = pWorkPlanes->get_Item(CComVariant(ikPlaneIdx),&pAsmStdWorkPlane);
if (FAILED(hRes) || (pAsmStdWorkPlane==nullptr)) {
ShowCOMError (hRes,L"AFWPIA, get_Item (workplane %d) failed",ikPlaneIdx) ;
return false ;
}
// Get the standard plane to use as a base for the offset plane
PlanePtr ThePlane = pAsmStdWorkPlane->GetPlane() ;
PointPtr StdPlaneOrigin = ThePlane->RootPoint ;
CComPtr<TransientGeometry> pTransGeo = GetTransGeomPtr () ;
// Internally Inventor always uses cm, so convert...
const double kOffsetInCm = kOffsetMm/10.0 ;
CComPtr<Point> pOrigin ;
hRes = pTransGeom->CreatePoint (StdPlaneOrigin->X,StdPlaneOrigin->Y,StdPlaneOrigin->Z,&pOrigin);
if (FAILED(hRes) || (pOrigin == nullptr)) {
ShowCOMError (hRes,L"AFWPIA, could not create origin point") ;
return false ;
}
CComPtr<UnitVector> uVector;
CComPtr<UnitVector> vVector;
switch (ikPlaneIdx) {
case gikXYPlaneIndex :
pTransGeo->CreateUnitVector (1.0, 0.0, 0.0, &uVector) ;
pTransGeo->CreateUnitVector (0.0, 1.0, 0.0, &vVector) ;
pOrigin->PutZ (kOffsetInCm) ;
break ;
case gikXZPlaneIndex :
pTransGeo->CreateUnitVector (1.0, 0.0, 0.0, &uVector) ;
pTransGeo->CreateUnitVector (0.0, 0.0, 1.0, &vVector) ;
pOrigin->PutY (kOffsetInCm) ;
break ;
case gikYZPlaneIndex :
pTransGeo->CreateUnitVector (0.0, 1.0, 0.0, &uVector) ;
pTransGeo->CreateUnitVector (0.0, 0.0, 1.0, &vVector) ;
pOrigin->PutX (kOffsetInCm) ;
break ;
default :
gLogger.Printf (ekErrMsg,L"AFWPIA unhandled index:%d", ikPlaneIdx) ;
// Do something anyway...
pTransGeo->CreateUnitVector (1.0, 0.0, 0.0, &uVector) ;
pTransGeo->CreateUnitVector (0.0, 1.0, 0.0, &vVector) ;
pOrigin->PutZ (kOffsetInCm) ;
break ;
}
CComPtr<WorkPlane> pOffsetWorkPlane;
hRes = pWorkPlanes->AddFixed(pOrigin,uVector,vVector, VARIANT_FALSE,&pOffsetWorkPlane);
if (FAILED(hRes) || pOffsetWorkPlane == nullptr) {
ShowCOMError (hRes,L"AFWPIA, Could not AddFixed plane %d",ikPlaneIdx) ;
return false ;
}
CComBSTR bstrName = CString (pszPlaneName) ;
hRes = pOffsetWorkPlane->put_Name (bstrName) ;
if (FAILED(hRes)) {
ShowCOMError (hRes,L"AFWPIA, Could not set plane name") ;
return false ;
}
CComBSTR bstrNameTest ;
pOffsetWorkPlane->get_Name (&bstrNameTest) ;
gLogger.Printf (ekLogMsg,L"AFWPIA <%s> <%s> ending ok",pszPlaneName,(LPWSTR)bstrNameTest) ;
return true ;
}
Follow pszPlaneName in the code above to see what I do...