Hello,
I need to change some Properties of a Steel Beam Element in Open Building Designer Update 8 using the C-Api "stfc-api"..
Until now I've been able to read the "LinearMember" out of the EditElementHandle and to change some Properties in it using
following Code:
virtual StatusInt _OnElementModify(EditElementHandleR eehSteelBeam) override { StatusInt statusInt; MSElementDescrP elmDescrP = eehSteelBeam .GetElementDescrP(); STFLinearMemberList* linearMemberListP=mdlSTFLinearMemberList_constructFromDescr(elmDescrP , false); //SUCCESS if (!linearMemberListP)return ERROR; STFLinearMember* linearMemberP=mdlSTFLinearMemberList_getLinearMember ( linearMemberListP ); //SUCCESS if (!linearMemberP)return ERROR; DPoint3d pP = { 0,0,0 }; DPoint3d pQ = { 0,0,0 }; mdlSTFLinearMember_getPQPoints(linearMemberP,&pP, &pQ); //SUCCESS pQ.z += 2000000; statusInt= mdlSTFLinearMember_setPQPoints(linearMemberP, &pP, &pQ); //SUCCESS statusInt=mdlSTFLinearMember_save(linearMemberP, false); //ERROR: 32768 //statusInt = mdlSTFLinearMember_replaceInDgn(linearMemberP); ////ERROR: 32768 mdlSTFLinearMemberList_free(&linearMemberListP); return SUCCESS;
But when I try to save it to the DGN It allways brings The ErrorSatus (StatusInt) = 32768 and nothing happens.
I tried "mdlSTFLinearMember_replaceInDgn" , "mdlSTFLinearMember_save" and "mdlSTFLinearMember_addToDgnExt" but nothing is working.
Hopefully there is sombody out there with some experience with the Open Building SDK.
Many thanks in advance for your efforts
Greetings
Manuel Höger
Softwareentwicklung | mhoeger@cadcom.de Tel: +49 30 - 53 63 62 – 44 | Mobil: +49 162 - 53 18 640
cadcom® Systemhaus GmbH Stralauer Platz 33 | Kontorhaus |10243 Berlin Tel: +49 30 - 53 63 62 – 0 | Fax: +49 30 - 53 63 62 - 30 www.cadcom.de
There is also additional helper class
STFPSSectionList and STFPSSection
here's header for them
TFAPI_EXPOSE StatusInt mdlSTFPSSectionList_append ( STFPSSectionList** ppThis, STFPSSectionList* pAppendList ); TFAPI_EXPOSE STFPSSectionList* mdlSTFPSSectionList_construct ( void ); TFAPI_EXPOSE StatusInt mdlSTFPSSectionList_construct2 ( STFPSSectionList** ppThis, STFPSSection* pPsSection ); TFAPI_EXPOSE STFPSSectionList* mdlSTFPSSectionList_duplicate ( STFPSSectionList* pThis ); TFAPI_EXPOSE void mdlSTFPSSectionList_free ( STFPSSectionList** ppThis ); TFAPI_EXPOSE int mdlSTFPSSectionList_getCount ( STFPSSectionList const* pThis ); TFAPI_EXPOSE int mdlSTFPSSectionList_getIndex ( STFPSSectionList const* pThis, STFPSSectionList const* pSearch ); TFAPI_EXPOSE STFPSSectionList* mdlSTFPSSectionList_getLast ( STFPSSectionList* pThis ); TFAPI_EXPOSE STFPSSectionList* mdlSTFPSSectionList_getNext ( STFPSSectionList* pThis ); TFAPI_EXPOSE STFPSSectionList* mdlSTFPSSectionList_getNode ( STFPSSectionList* pThis, int index ); TFAPI_EXPOSE STFPSSection* mdlSTFPSSectionList_getPSSection ( STFPSSectionList* pThis ); TFAPI_EXPOSE void mdlSTFPSSectionList_insertList ( STFPSSectionList* pThis, STFPSSectionList* pInsert ); TFAPI_EXPOSE StatusInt mdlSTFPSSectionList_prepend ( STFPSSectionList** ppThis, STFPSSectionList* pAdd ); TFAPI_EXPOSE StatusInt mdlSTFPSSectionList_reverse ( STFPSSectionList** ppThis ); TFAPI_EXPOSE StatusInt mdlSTFPSSectionList_setNext ( STFPSSectionList* pThis, STFPSSectionList* pNext ); TFAPI_EXPOSE STFPSSectionList* mdlSTFPSSectionList_unlinkNode ( STFPSSectionList** ppThis, STFPSSectionList* pRemove ); TFAPI_EXPOSE StatusInt mdlSTFPSSection_duplicate ( STFPSSection* pThis, STFPSSectionList** ppCopy ); TFAPI_EXPOSE StatusInt mdlSTFPSSection_initialize ( STFPSSection* pThis ); TFAPI_EXPOSE StatusInt mdlSTFPSSection_setFullCrossSection ( STFPSSection* pThis, WChar const* fullSectionName ); TFAPI_EXPOSE TFWStringList* mdlSTFPSSection_getFullSectionName ( STFPSSection const* pThis ); TFAPI_EXPOSE bool mdlSTFPSSection_taperingIsPossible ( STFPSSection const* pThis ); TFAPI_EXPOSE StatusInt mdlSTFPSSection_setCrossSection ( STFPSSection* pThis, int sectionType, WChar const* sectionClass, WChar const* sectionName ); TFAPI_EXPOSE StatusInt mdlSTFPSSection_swap ( STFPSSection* pThis, STFPSSection* pThat ); TFAPI_EXPOSE StatusInt mdlSTFPSSection_init ( STFPSSection* pThis, WChar const* sectionName ); TFAPI_EXPOSE bool mdlSTFPSSection_isValid ( STFPSSection const* pThis ); TFAPI_EXPOSE bool mdlSTFPSSection_hasCentroid ( STFPSSection* pThis ); TFAPI_EXPOSE StatusInt mdlSTFPSSection_getCentroid ( STFPSSection* pThis, DPoint2d* pCentroid, bool reflected ); TFAPI_EXPOSE StatusInt mdlSTFPSSection_getInsertPointOffset ( STFPSSection const* pThis, DPoint2d* pOffset, int insertPointIndex, bool reflected ); TFAPI_EXPOSE StatusInt mdlSTFPSSection_setModelRef ( STFPSSection* pThis, DgnModelRefP pModelRef ); TFAPI_EXPOSE StatusInt mdlSTFPSSection_getWidth ( STFPSSection const* pThis, double* pWidth ); TFAPI_EXPOSE StatusInt mdlSTFPSSection_getHeight ( STFPSSection const* pThis, double* pHeight ); TFAPI_EXPOSE StatusInt mdlSTFPSSection_getWeight ( STFPSSection const* pThis, double* pWeight ); TFAPI_EXPOSE StatusInt mdlSTFPSSection_getFlangeThickness ( STFPSSection const* pThis, double* pFlangeThickness ); TFAPI_EXPOSE StatusInt mdlSTFPSSection_initByRectangularProps ( STFPSSection* pThis, double width, double height );
Great!
I think, now I have the tools I need.
Thanks a lot! Maybe you- could give me a small example for a concrete shape and a steel beam. But only if it's not too time intensive. I could find out by myself but probably it would cost me a lot of time.
Here are some simple examples to place concrete and steel beams for US dataset
template <typename T, typename DeleteF> static [[nodiscard]] std::unique_ptr<T, DeleteF> tfmake_unique(T* myObject, DeleteF deleteF) noexcept { return std::unique_ptr<T, DeleteF>(myObject, deleteF); } static void placeMember(WChar const* catalogType, WChar const* catalogName, int sectionType, WChar const* sectionClass, WChar const* sectionName) { if (auto pStructuralList = tfmake_unique(mdlSTFStructuralMemberList_construct(), [](auto* p) { mdlSTFStructuralMemberList_free(&p); })) { STFStructuralMember* pMember = mdlSTFStructuralMemberList_getStructuralMember(pStructuralList.get()); // hardcode the member's end points DPoint3d startPt{ 0, 0, 0 }; DPoint3d endPt{ 0, 0, 0 }; double lengthMU{ 10 }; mdlSTFStructuralMember_setCatalogItem2(pMember, catalogType, catalogName, true); mdlSTFStructuralMember_setCrossSection(pMember, sectionType, sectionClass, sectionName); mdlCnv_masterToUOR(&endPt.y, lengthMU, mdlModelRef_getActive()); mdlSTFStructuralMember_setPQPoints(pMember, &startPt, &endPt); // hardcode the member's placement point mdlSTFStructuralMember_setPlacementPoint(pMember, 8); //write and get the ElementDescriptor auto pED = tfmake_unique(mdlSTFStructuralMember_createElementWritten(pMember, mdlModelRef_getActive()), [](auto* p) { mdlElmdscr_freeAll(&p); }); } } //1 standard shape //2 user shape //4 combined shape //5 weld shape //6 parametric shape RECTANGLE or CIRCLE class static void placeConcreteMember() { placeMember(L"Concrete Beam", L"Beams", 6, L"RECTANGLE", L"1x1"); //same for all datasets placeMember(L"Concrete Beam", L"Beams", 6, L"CIRCLE", L"1"); //same for all datasets placeMember(L"Concrete Beam", L"Beams", 2, L"HEXAGON", L"H10.0DIA"); //class & section name unique for US dataset } static void placeSteelMember() { placeMember(L"Steel Beam", L"Beams", 1, L"AISC_I_W", L"W10X12"); //class & section name unique for US dataset placeMember(L"Steel Beam", L"Beams", 2, L"HEXAGON HOLLOW", L"H18.0DIAX0.5"); //class & section name unique for US dataset placeMember(L"Steel Beam", L"Beams", 4, L"DOUBLE_ANGLES (AISC_I_C)", L"2L2-1_2X2-1_2X5_16X3_8"); //class & section name unique for US dataset placeMember(L"Steel Beam", L"Beams", 5, L"IMPERIAL", L"W10X15"); //class & section name unique for US dataset }
Thanks again.
But I'm a little bit surprised that you use C++17 Features. Is this possible with the MS-SDK? If I switch to c++17 I got a lot of Errors.
What is your magic?
It's C++14 but I'm also using SKD Update 9