diff --git a/EXE_GdbCreateSurf.cpp b/EXE_GdbCreateSurf.cpp index 92f5e4b..7cc0965 100644 --- a/EXE_GdbCreateSurf.cpp +++ b/EXE_GdbCreateSurf.cpp @@ -1716,56 +1716,68 @@ ExeCreateSurfBezierRational( int nParentId, int nDegU, int nDegV, int nSpanU, in //------------------------------------------------------------------------------- int -ExeCreateSurfBezierLeaves( int nParentId, int nSurfBzId, int nTextHeight, bool bShowTrim) +ExeCreateSurfBezierLeaves( int nParentId, int nSurfBzId, int nTextHeight, bool bShowTrim, int* pnCount) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) - nParentId = AdjustId( nParentId) ; - ISurfBezier* pSurfBez = GetSurfBezier( pGeomDB->GetGeoObj( nSurfBzId)) ; + nParentId = AdjustId( nParentId) ; + // recupero la superficie + const ISurfBezier* pSurfBez = GetSurfBezier( pGeomDB->GetGeoObj( nSurfBzId)) ; if ( pSurfBez == nullptr) - return false ; - // recupero il riferimento della superficie - Frame3d frSurf ; - if ( ! pGeomDB->GetGlobFrame( nSurfBzId, frSurf)) - return false ; - bool bOk = true ; - //disegno le foglie + return GDB_ID_NULL ; + // disegno le foglie vector> vLeaves ; pSurfBez->GetLeaves( vLeaves) ; double dFactor = 1 ; - int nId ; - for ( int k = 0 ; k < (int)vLeaves.size() ; ++k ) { - Point3d ptBL = std::get<1>(vLeaves[k]) * dFactor ; - Point3d ptTR = std::get<2>(vLeaves[k]) * dFactor ; - Point3d ptBr( ptTR.x, ptBL.y) ; - Point3d ptTl( ptBL.x, ptTR.y) ; + int nFirstId = GDB_ID_NULL ; + int nCount = 0 ; + for ( int k = 0 ; k < (int)vLeaves.size() ; ++ k) { + Point3d ptBL = get<1>( vLeaves[k]) * dFactor ; + Point3d ptTR = get<2>( vLeaves[k]) * dFactor ; + Point3d ptBR( ptTR.x, ptBL.y) ; + Point3d ptTL( ptBL.x, ptTR.y) ; PolyLine PL ; PL.AddUPoint( 0, ptBL) ; - PL.AddUPoint( 1, ptBr) ; + PL.AddUPoint( 1, ptBR) ; PL.AddUPoint( 2, ptTR) ; - PL.AddUPoint( 3, ptTl) ; - PL.AddUPoint( 4, ptBL) ; - // creo la curva e la inserisco nel GDB + PL.AddUPoint( 3, ptTL) ; + PL.Close() ; + // creo la curva e la inserisco nel GDB PtrOwner pCrvCompo( CreateCurveComposite()) ; - bOk = bOk && ! IsNull( pCrvCompo) ; - // inserisco i segmenti che uniscono i punti - bOk = bOk && pCrvCompo->FromPolyLine( PL) ; - // assegno il versore estrusione - bOk = bOk && pCrvCompo->SetExtrusion( Z_AX) ; - // inserisco la curva composita nel DB - pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( pCrvCompo)) ; - string sText = ToString( std::get<0>(vLeaves[k])) ; - // creo il testo e lo riempio - Point3d ptCenter( (ptBL + ptTR) / 2) ; + if ( IsNull( pCrvCompo) || ! pCrvCompo->FromPolyLine( PL) || ! pCrvCompo->SetExtrusion( Z_AX)) + return GDB_ID_NULL ; + // inserisco la curva composita nel DB + int nCrvId = pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( pCrvCompo)) ; + if ( nCrvId == GDB_ID_NULL) + return GDB_ID_NULL ; + ++ nCount ; + if ( nFirstId == GDB_ID_NULL) + nFirstId = nCrvId ; + // creo il testo e lo riempio + string sText = ToString( get<0>( vLeaves[k])) ; + Point3d ptCenter( ( ptBL + ptTR) / 2) ; PtrOwner pTXT( CreateExtText()) ; - bOk = bOk && ! IsNull( pTXT) ; - bOk = bOk && pTXT->Set( ptCenter, Z_AX, X_AX, sText, "", false, nTextHeight) ; - // inserisco il testo nel DB - nId = ( bOk ? pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( pTXT)): GDB_ID_NULL) ; + if ( IsNull( pTXT) || ! pTXT->Set( ptCenter, Z_AX, X_AX, sText, "", false, nTextHeight)) + return GDB_ID_NULL ; + // inserisco il testo nel DB + int nTxtId = pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( pTXT)) ; + if ( nTxtId == GDB_ID_NULL) + return GDB_ID_NULL ; + ++ nCount ; } - PtrOwner pTrimReg( pSurfBez->GetTrimRegion()->Clone()) ; - if ( bShowTrim && ! IsNull( pTrimReg)) - nId = ( bOk ? pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( pTrimReg)) : -1 ) ; - - return nId ; + // se richiesto disegno la regione di trim + const ISurfFlatRegion* pSfr = pSurfBez->GetTrimRegion() ; + if ( bShowTrim && pSfr != nullptr) { + PtrOwner pTrimReg( pSfr->Clone()) ; + if ( ! IsNull( pTrimReg)) { + int nTrimId = pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( pTrimReg)) ; + if ( nTrimId == GDB_ID_NULL) + return GDB_ID_NULL ; + ++ nCount ; + } + } + // restituisco i risultati + if ( pnCount != nullptr) + *pnCount = nCount ; + return nFirstId ; } diff --git a/LUA_GdbCreateSurf.cpp b/LUA_GdbCreateSurf.cpp index b9f755d..bb05e0c 100644 --- a/LUA_GdbCreateSurf.cpp +++ b/LUA_GdbCreateSurf.cpp @@ -872,24 +872,31 @@ LuaCreateSurfBezierRational( lua_State* L) static int LuaCreateSurfBezierLeaves( lua_State* L) { - // 3 parametri : ParentId, nId, nTextHeight + // 2, 3 o 4 parametri : ParentId, nId [, nTextHeight] [, bShowTrim] int nParentId ; LuaCheckParam( L, 1, nParentId) int nSurfBzId ; LuaCheckParam( L, 2, nSurfBzId) - int nTextHeight ; - LuaCheckParam( L, 3, nTextHeight) - bool bShowTrim ; - LuaCheckParam( L, 4, bShowTrim) + int nTextHeight = 50 ; + bool bShowTrim = false ; + if ( LuaGetParam( L, 3, nTextHeight)) + LuaGetParam( L, 4, bShowTrim) ; + else + LuaGetParam( L, 3, bShowTrim) ; LuaClearStack( L) ; // creo la superficie - int nId = ExeCreateSurfBezierLeaves( nParentId, nSurfBzId, nTextHeight, bShowTrim) ; + int nCount = 0 ; + int nId = ExeCreateSurfBezierLeaves( nParentId, nSurfBzId, nTextHeight, bShowTrim, &nCount) ; // restituisco il risultato - if ( nId != GDB_ID_NULL) + if ( nId != GDB_ID_NULL) { LuaSetParam( L, nId) ; - else + LuaSetParam( L, nCount) ; + } + else { LuaSetParam( L) ; - return 1 ; + LuaSetParam( L) ; + } + return 2 ; } //-------------------------------------------------------------------------------