//---------------------------------------------------------------------------- // EgalTech 2016-2016 //---------------------------------------------------------------------------- // File : MachineLuaCL.cpp Data : 26.04.16 Versione : 1.6p4 // Contenuto : Implementazione gestione macchina : funzioni Lua per CL. // // // // Modifiche : 26.04.16 DS Creazione modulo. // // //---------------------------------------------------------------------------- //--------------------------- Include ---------------------------------------- #include "stdafx.h" #include "MachMgr.h" #include "DllMain.h" #include "CamData.h" #include "Operation.h" #include "/EgtDev/Include/EXeExecutor.h" #include "/EgtDev/Include/EGkGeoPoint3d.h" #include "/EgtDev/Include/EGkGeoVector3d.h" #include "/EgtDev/Include/EGkCurveLine.h" #include "/EgtDev/Include/EGkCurveArc.h" #include "/EgtDev/Include/EGkCurveComposite.h" #include "/EgtDev/Include/EGkIntersLineCylinder.h" #include "/EgtDev/Include/EGkOffsetCurve3d.h" #include "/EgtDev/Include/EGkGeomDB.h" #include "/EgtDev/Include/EGkLuaAux.h" #include "/EgtDev/Include/EGkStringUtils3d.h" #include "/EgtDev/Include/EGnStringUtils.h" #include "/EgtDev/Include/EGnFileUtils.h" #include "/EgtDev/Include/ENkPolynomialRoots.h" #include "/EgtDev/Include/EgtPointerOwner.h" using namespace std ; #define COLOR5AX 0 #define DRAWCYL 0 //---------------------------------------------------------------------------- int Machine::LuaEmtAddRapidStart( lua_State* L) { // 6, 7 o 8 parametri : nPathId, ptP, vtTool, vtCorr, vtAux, nFlag [, nFlag2] [, bToolShow] int nPathId ; LuaCheckParam( L, 1, nPathId) Point3d ptP ; LuaCheckParam( L, 2, ptP) Vector3d vtTool ; LuaCheckParam( L, 3, vtTool) Vector3d vtCorr ; LuaCheckParam( L, 4, vtCorr) Vector3d vtAux ; LuaCheckParam( L, 5, vtAux) int nFlag ; LuaCheckParam( L, 6, nFlag) int nFlag2 = 0 ; bool bToolShow = false ; if ( LuaGetParam( L, 7, nFlag2)) LuaGetParam( L, 8, bToolShow) ; else LuaGetParam( L, 7, bToolShow) ; LuaClearStack( L) ; // verifico ci sia una macchina attiva valida if ( m_pMchLua == nullptr || m_pMchLua->m_pMchMgr == nullptr || m_pMchLua->m_pGeomDB == nullptr) return luaL_error( L, " Unknown Machine") ; // creo oggetto punto per DB geometrico PtrOwner pGP( CreateGeoPoint3d()) ; bool bOk = ! IsNull( pGP) ; // assegno le coordinate del punto bOk = bOk && pGP->Set( ptP) ; // inserisco l'oggetto nel DB geometrico int nId = ( bOk ? m_pMchLua->m_pGeomDB->AddGeoObj( GDB_ID_NULL, nPathId, Release( pGP)) : GDB_ID_NULL) ; bOk = bOk && ( nId != GDB_ID_NULL) ; // creo oggetto dati Cam PtrOwner pCam( new( nothrow) CamData) ; bOk = bOk && ! IsNull( pCam) ; if ( bOk) { // assegno valori pCam->SetMoveType( 0) ; pCam->SetToolDir( vtTool) ; pCam->SetCorrDir( vtCorr) ; pCam->SetAuxDir( vtAux) ; pCam->SetEndPoint( ptP) ; pCam->SetFeed( 0) ; pCam->SetFlag( nFlag) ; pCam->SetFlag2( nFlag2) ; pCam->SetToolShow( bToolShow) ; // associo questo oggetto a quello geometrico m_pMchLua->m_pGeomDB->SetUserObj( nId, Release( pCam)) ; } // assegno risultato if ( bOk) LuaSetParam( L, nId) ; else LuaSetParam( L) ; return 1 ; } //---------------------------------------------------------------------------- int Machine::LuaEmtAddRapidMove( lua_State* L) { // 7, 8 o 9 parametri : nPathId, ptIni, ptFin, vtTool, vtCorr, vtAux, nFlag [, nFlag2] [, bToolShow] int nPathId ; LuaCheckParam( L, 1, nPathId) Point3d ptIni ; LuaCheckParam( L, 2, ptIni) Point3d ptFin ; LuaCheckParam( L, 3, ptFin) Vector3d vtTool ; LuaCheckParam( L, 4, vtTool) Vector3d vtCorr ; LuaCheckParam( L, 5, vtCorr) Vector3d vtAux ; LuaCheckParam( L, 6, vtAux) int nFlag ; LuaCheckParam( L, 7, nFlag) int nFlag2 = 0 ; bool bToolShow = false ; if ( LuaGetParam( L, 8, nFlag2)) LuaGetParam( L, 9, bToolShow) ; else LuaGetParam( L, 8, bToolShow) ; LuaClearStack( L) ; // verifico ci sia una macchina attiva valida if ( m_pMchLua == nullptr || m_pMchLua->m_pMchMgr == nullptr || m_pMchLua->m_pGeomDB == nullptr) return luaL_error( L, " Unknown Machine") ; // creo oggetto linea per DB geometrico PtrOwner pLine( CreateCurveLine()) ; bool bOk = ! IsNull( pLine) ; // assegno gli estremi della linea bOk = bOk && pLine->Set( ptIni, ptFin) ; // inserisco l'oggetto nel DB geometrico int nId = ( bOk ? m_pMchLua->m_pGeomDB->AddGeoObj( GDB_ID_NULL, nPathId, Release( pLine)) : GDB_ID_NULL) ; bOk = bOk && ( nId != GDB_ID_NULL) ; // creo oggetto dati Cam PtrOwner pCam( new( nothrow) CamData) ; bOk = bOk && ! IsNull( pCam) ; if ( bOk) { // assegno valori pCam->SetMoveType( 0) ; pCam->SetToolDir( vtTool) ; pCam->SetCorrDir( vtCorr) ; pCam->SetAuxDir( vtAux) ; pCam->SetEndPoint( ptFin) ; pCam->SetFeed( 0) ; pCam->SetFlag( nFlag) ; pCam->SetFlag2( nFlag2) ; pCam->SetToolShow( bToolShow) ; // associo questo oggetto a quello geometrico m_pMchLua->m_pGeomDB->SetUserObj( nId, Release( pCam)) ; } // assegno risultato if ( bOk) LuaSetParam( L, nId) ; else LuaSetParam( L) ; return 1 ; } //---------------------------------------------------------------------------- int AddLinearMove( const Point3d& ptIni, const Point3d& ptFin, IGeomDB* pGeomDB , int nPathId, const Vector3d& vtTool, const Vector3d& vtCorr, const Vector3d& vtAux, double dFeed, int nFlag, int nFlag2, bool bToolShow, int nRefId = GDB_ID_NULL) { // creo oggetto linea per DB geometrico PtrOwner pLine( CreateCurveLine()) ; bool bOk = ! IsNull( pLine) ; // assegno gli estremi della linea bOk = bOk && pLine->Set( ptIni, ptFin) ; // inserisco l'oggetto nel DB geometrico int nId = ( bOk ? pGeomDB->AddGeoObj( GDB_ID_NULL, nPathId, Release( pLine)) : GDB_ID_NULL) ; bOk = bOk && ( nId != GDB_ID_NULL) ; if ( bOk && nRefId != GDB_ID_NULL) pGeomDB->RelocateGlob( nId, nRefId, GDB_AFTER) ; // creo oggetto dati Cam PtrOwner pCam( new( nothrow) CamData) ; bOk = bOk && ! IsNull( pCam) ; if ( bOk) { // assegno valori pCam->SetMoveType( 1) ; pCam->SetToolDir( vtTool) ; pCam->SetCorrDir( vtCorr) ; pCam->SetAuxDir( vtAux) ; pCam->SetEndPoint( ptFin) ; pCam->SetFeed( dFeed) ; pCam->SetFlag( nFlag) ; pCam->SetFlag2( nFlag2) ; pCam->SetToolShow( bToolShow) ; // associo questo oggetto a quello geometrico pGeomDB->SetUserObj( nId, Release( pCam)) ; } return nId ; } //---------------------------------------------------------------------------- int Machine::LuaEmtAddLinearMove( lua_State* L) { // 8, 9 o 10 parametri : nPathId, ptIni, ptFin, vtTool, vtCorr, vtAux, dFeed, nFlag [, nFlag2] [, bToolShow] int nPathId ; LuaCheckParam( L, 1, nPathId) Point3d ptIni ; LuaCheckParam( L, 2, ptIni) Point3d ptFin ; LuaCheckParam( L, 3, ptFin) Vector3d vtTool ; LuaCheckParam( L, 4, vtTool) Vector3d vtCorr ; LuaCheckParam( L, 5, vtCorr) Vector3d vtAux ; LuaCheckParam( L, 6, vtAux) double dFeed ; LuaCheckParam( L, 7, dFeed) int nFlag ; LuaCheckParam( L, 8, nFlag) int nFlag2 = 0 ; bool bToolShow = false ; if ( LuaGetParam( L, 9, nFlag2)) LuaGetParam( L, 10, bToolShow) ; else LuaGetParam( L, 9, bToolShow) ; LuaClearStack( L) ; // verifico ci sia una macchina attiva valida if ( m_pMchLua == nullptr || m_pMchLua->m_pMchMgr == nullptr || m_pMchLua->m_pGeomDB == nullptr) return luaL_error( L, " Unknown Machine") ; int nId = AddLinearMove( ptIni, ptFin, m_pMchLua->m_pGeomDB, nPathId, vtTool, vtCorr, vtAux, dFeed, nFlag, nFlag2, bToolShow) ; bool bOk = nId != GDB_ID_NULL ; // assegno risultato if ( bOk) LuaSetParam( L, nId) ; else LuaSetParam( L) ; return 1 ; } //---------------------------------------------------------------------------- int Machine::LuaEmtAddArcMove( lua_State* L) { // 11 o 12 parametri : nPathId, ptIni, ptFin, ptCen, dAngCen, vtN, vtTool, vtCorr, vtAux, dFeed, nFlag [, bToolShow] int nPathId ; LuaCheckParam( L, 1, nPathId) Point3d ptIni ; LuaCheckParam( L, 2, ptIni) Point3d ptFin ; LuaCheckParam( L, 3, ptFin) Point3d ptCen ; LuaCheckParam( L, 4, ptCen) double dAngCen ; LuaCheckParam( L, 5, dAngCen) Vector3d vtN ; LuaCheckParam( L, 6, vtN) Vector3d vtTool ; LuaCheckParam( L, 7, vtTool) Vector3d vtCorr ; LuaCheckParam( L, 8, vtCorr) Vector3d vtAux ; LuaCheckParam( L, 9, vtAux) double dFeed ; LuaCheckParam( L, 10, dFeed) int nFlag ; LuaCheckParam( L, 11, nFlag) bool bToolShow = false ; LuaGetParam( L, 12, bToolShow) ; LuaClearStack( L) ; // verifico ci sia una macchina attiva valida if ( m_pMchLua == nullptr || m_pMchLua->m_pMchMgr == nullptr || m_pMchLua->m_pGeomDB == nullptr) return luaL_error( L, " Unknown Machine") ; // creo oggetto arco per DB geometrico PtrOwner pArc( CreateCurveArc()) ; bool bOk = ! IsNull( pArc) ; // assegno i dati dell'arco double dDeltaZ = ( ptFin - ptIni) * vtN ; bOk = bOk && pArc->SetCPAN( ptCen, ptIni, dAngCen, dDeltaZ, vtN) ; Point3d ptCalcFin ; bOk = bOk && ( pArc->GetEndPoint( ptCalcFin) && AreSamePointApprox( ptCalcFin, ptFin)) ; int nMove = ( dAngCen > 0 ? 3 : 2) ; // inserisco l'oggetto nel DB geometrico int nId = ( bOk ? m_pMchLua->m_pGeomDB->AddGeoObj( GDB_ID_NULL, nPathId, Release( pArc)) : GDB_ID_NULL) ; bOk = bOk && ( nId != GDB_ID_NULL) ; // creo oggetto dati Cam PtrOwner pCam( new( nothrow) CamData) ; bOk = bOk && ! IsNull( pCam) ; if ( bOk) { // assegno valori pCam->SetMoveType( nMove) ; pCam->SetToolDir( vtTool) ; pCam->SetCorrDir( vtCorr) ; pCam->SetAuxDir( vtAux) ; pCam->SetEndPoint( ptFin) ; pCam->SetCenter( ptCen) ; pCam->SetAngCen( dAngCen) ; pCam->SetDeltaN( dDeltaZ) ; pCam->SetNormDir( vtN) ; pCam->SetFeed( dFeed) ; pCam->SetFlag( nFlag) ; pCam->SetToolShow( bToolShow) ; // associo questo oggetto a quello geometrico m_pMchLua->m_pGeomDB->SetUserObj( nId, Release( pCam)) ; } // assegno risultato if ( bOk) LuaSetParam( L, nId) ; else LuaSetParam( L) ; return 1 ; } //---------------------------------------------------------------------------- int Machine::LuaEmtAddClimb( lua_State* L) { // 5 o 6 o 7 parametri : nMachId [, sMain], vAxVal, nMask, nFlag, nFlag2 [, sInfo] int nMachId ; LuaCheckParam( L, 1, nMachId) string sMain = MCH_CL ; int nOffs = ( LuaGetParam( L, 2, sMain) ? 1 : 0) ; bool bMain = ( ! EqualNoCase( sMain, MCH_DBL)) ; DBLVECTOR vAxVal ; LuaCheckParam( L, 2 + nOffs, vAxVal) int nMask ; LuaCheckParam( L, 3 + nOffs, nMask) int nFlag ; LuaCheckParam( L, 4 + nOffs, nFlag) int nFlag2 ; LuaCheckParam( L, 5 + nOffs, nFlag2) string sInfo = "" ; LuaGetParam( L, 6 + nOffs, sInfo) ; LuaClearStack( L) ; // verifico ci sia una macchina attiva valida if ( m_pMchLua == nullptr || m_pMchLua->m_pMchMgr == nullptr || m_pMchLua->m_pGeomDB == nullptr) return luaL_error( L, " Unknown Machine") ; // verifica "Main" e "Double" if ( ! EqualNoCase( sMain, MCH_CL) && ! EqualNoCase( sMain, MCH_DBL)) return luaL_error( L, ( " Error in EmtAddClimb : " + sMain).c_str()) ; // recupero l'operazione Operation* pOper = GetOperation( m_pMchLua->m_pGeomDB->GetUserObj( nMachId)) ; // imposto la discesa (primo movimento del primo percorso della lavorazione) bool bOk = ( pOper != nullptr && pOper->AddSpecialClimb( vAxVal, ( nMask >= 0), GDB_ID_NULL, bMain, nFlag, nFlag2, nMask, sInfo, false)) ; if ( ! bOk) return luaL_error( L, " Error in EmtAddClimb") ; LuaSetParam( L, bOk) ; return 1 ; } //---------------------------------------------------------------------------- int Machine::LuaEmtRemoveClimb( lua_State* L) { // 1 o 2 parametri : nMachId [, sMain] int nMachId ; LuaCheckParam( L, 1, nMachId) string sMain = MCH_CL ; LuaGetParam( L, 2, sMain) ; bool bMain = ( ! EqualNoCase( sMain, MCH_DBL)) ; LuaClearStack( L) ; // verifico ci sia una macchina attiva valida if ( m_pMchLua == nullptr || m_pMchLua->m_pMchMgr == nullptr || m_pMchLua->m_pGeomDB == nullptr) return luaL_error( L, " Unknown Machine") ; // verifica "Main" e "Double" if ( ! EqualNoCase( sMain, MCH_CL) && ! EqualNoCase( sMain, MCH_DBL)) return luaL_error( L, ( " Error in EmtAddClimb : " + sMain).c_str()) ; // recupero l'operazione Operation* pOper = GetOperation( m_pMchLua->m_pGeomDB->GetUserObj( nMachId)) ; // elimino le discese (primi movimenti "CLIMB" del primo percorso della lavorazione) bool bOk = ( pOper != nullptr && pOper->RemoveClimb( GDB_ID_NULL, bMain)) ; LuaSetParam( L, bOk) ; return 1 ; } //---------------------------------------------------------------------------- int Machine::LuaEmtAddRise( lua_State* L) { // 5 o 6 o 7 parametri : nMachId [, sMain], vAxVal, nMask, nFlag, nFlag2 [, sInfo] int nMachId ; LuaCheckParam( L, 1, nMachId) string sMain = MCH_CL ; int nOffs = ( LuaGetParam( L, 2, sMain) ? 1 : 0) ; bool bMain = ( ! EqualNoCase( sMain, MCH_DBL)) ; DBLVECTOR vAxVal ; LuaCheckParam( L, 2 + nOffs, vAxVal) int nMask ; LuaCheckParam( L, 3 + nOffs, nMask) int nFlag ; LuaCheckParam( L, 4 + nOffs, nFlag) int nFlag2 ; LuaCheckParam( L, 5 + nOffs, nFlag2) string sInfo = "" ; LuaGetParam( L, 6 + nOffs, sInfo) ; LuaClearStack( L) ; // verifico ci sia una macchina attiva valida if ( m_pMchLua == nullptr || m_pMchLua->m_pMchMgr == nullptr || m_pMchLua->m_pGeomDB == nullptr) return luaL_error( L, " Unknown Machine") ; // verifica "Main" e "Double" if ( ! EqualNoCase( sMain, MCH_CL) && ! EqualNoCase( sMain, MCH_DBL)) return luaL_error( L, ( " Error in EmtAddClimb : " + sMain).c_str()) ; // recupero l'operazione Operation* pOper = GetOperation( m_pMchLua->m_pGeomDB->GetUserObj( nMachId)) ; // aggiungo la risalita (ultimo movimento dell'ultimo percorso della lavorazione) bool bOk = ( pOper != nullptr && pOper->AddSpecialRise( vAxVal, ( nMask >= 0), GDB_ID_NULL, bMain, nFlag, nFlag2, nMask, sInfo)) ; if ( ! bOk) return luaL_error( L, " Error in EmtAddRise") ; LuaSetParam( L, bOk) ; return 1 ; } //---------------------------------------------------------------------------- int Machine::LuaEmtRemoveRise( lua_State* L) { // 1 o 2 parametri : nMachId [, bMain] int nMachId ; LuaCheckParam( L, 1, nMachId) string sMain = MCH_CL ; LuaGetParam( L, 2, sMain) ; bool bMain = ( ! EqualNoCase( sMain, MCH_DBL)) ; LuaClearStack( L) ; // verifico ci sia una macchina attiva valida if ( m_pMchLua == nullptr || m_pMchLua->m_pMchMgr == nullptr || m_pMchLua->m_pGeomDB == nullptr) return luaL_error( L, " Unknown Machine") ; // verifica "Main" e "Double" if ( ! EqualNoCase( sMain, MCH_CL) && ! EqualNoCase( sMain, MCH_DBL)) return luaL_error( L, ( " Error in EmtAddClimb : " + sMain).c_str()) ; // recupero l'operazione Operation* pOper = GetOperation( m_pMchLua->m_pGeomDB->GetUserObj( nMachId)) ; // elimino le risalite (ultimi movimenti "RISE" dell'ultimo percorso della lavorazione) bool bOk = ( pOper != nullptr && pOper->RemoveRise( GDB_ID_NULL, bMain)) ; LuaSetParam( L, bOk) ; return 1 ; } //---------------------------------------------------------------------------- int Machine::LuaEmtGetInitialAxesPos( lua_State* L) { // 1 o 2 o 3 parametri : nMachId [, sMain] [, bSkipClimb] int nMachId ; LuaCheckParam( L, 1, nMachId) string sMain = MCH_CL ; int nOffs = ( LuaGetParam( L, 2, sMain) ? 1 : 0) ; bool bMain = ( ! EqualNoCase( sMain, MCH_DBL)) ; bool bSkipClimb = true ; LuaGetParam( L, 2 + nOffs, bSkipClimb) ; LuaClearStack( L) ; // verifico ci sia una macchina attiva valida if ( m_pMchLua == nullptr || m_pMchLua->m_pMchMgr == nullptr || m_pMchLua->m_pGeomDB == nullptr) return luaL_error( L, " Unknown Machine") ; // recupero l'operazione Operation* pOper = GetOperation( m_pMchLua->m_pGeomDB->GetUserObj( nMachId)) ; // acquisico il valore iniziale degli assi macchina DBLVECTOR vAxesVal ; bool bOk = ( pOper != nullptr && pOper->GetInitialAxesValues( bSkipClimb, bMain, vAxesVal)) ; if ( bOk) LuaSetParam( L, vAxesVal) ; else LuaSetParam( L) ; return 1 ; } //---------------------------------------------------------------------------- int Machine::LuaEmtGetFinalAxesPos( lua_State* L) { // 1 o 2 o 3 parametri : nMachId [, sMain] [, bSkipRise] int nMachId ; LuaCheckParam( L, 1, nMachId) bool bSkipRise = true ; string sMain = MCH_CL ; int nOffs = ( LuaGetParam( L, 2, sMain) ? 1 : 0) ; bool bMain = ( ! EqualNoCase( sMain, MCH_DBL)) ; LuaGetParam( L, 2 + nOffs, bSkipRise) ; LuaClearStack( L) ; // verifico ci sia una macchina attiva valida if ( m_pMchLua == nullptr || m_pMchLua->m_pMchMgr == nullptr || m_pMchLua->m_pGeomDB == nullptr) return luaL_error( L, " Unknown Machine") ; // recupero l'operazione Operation* pOper = GetOperation( m_pMchLua->m_pGeomDB->GetUserObj( nMachId)) ; // acquisico il valore finale degli assi macchina DBLVECTOR vAxesVal ; bool bOk = ( pOper != nullptr && pOper->GetFinalAxesValues( bSkipRise, bMain, vAxesVal)) ; if ( bOk) LuaSetParam( L, vAxesVal) ; else LuaSetParam( L) ; return 1 ; } //---------------------------------------------------------------------------- int Machine::LuaEmtGetCurrAxesHomePos( lua_State* L) { // nessun parametro LuaClearStack( L) ; // verifico ci sia una macchina attiva valida if ( m_pMchLua == nullptr || m_pMchLua->m_pMchMgr == nullptr || m_pMchLua->m_pGeomDB == nullptr) return luaL_error( L, " Unknown Machine") ; // acquisisco la posizione di home degli assi della catena cinematica corrente DBLVECTOR vAxHomeVal ; bool bOk = m_pMchLua->GetAllCurrAxesHomePos( vAxHomeVal) ; if ( bOk) LuaSetParam( L, vAxHomeVal) ; else LuaSetParam( L) ; return 1 ; } //---------------------------------------------------------------------------- int Machine::LuaEmtGetMoveType( lua_State* L) { // 1 parametro : nClEntId int nClEntId ; LuaCheckParam( L, 1, nClEntId) LuaClearStack( L) ; // verifico ci sia una macchina attiva valida if ( m_pMchLua == nullptr || m_pMchLua->m_pMchMgr == nullptr || m_pMchLua->m_pGeomDB == nullptr) return luaL_error( L, " Unknown Machine") ; // recupero l'oggetto CamData const CamData* pCamData = GetCamData( m_pMchLua->m_pGeomDB->GetUserObj( nClEntId)) ; bool bOk = ( pCamData != nullptr) ; if ( bOk) { int nMove = pCamData->GetMoveType() ; LuaSetParam( L, nMove) ; } else LuaSetParam( L) ; return 1 ; } //---------------------------------------------------------------------------- int Machine::LuaEmtGetAxesPos( lua_State* L) { // 1 parametro : nClEntId int nClEntId ; LuaCheckParam( L, 1, nClEntId) LuaClearStack( L) ; // verifico ci sia una macchina attiva valida if ( m_pMchLua == nullptr || m_pMchLua->m_pMchMgr == nullptr || m_pMchLua->m_pGeomDB == nullptr) return luaL_error( L, " Unknown Machine") ; // recupero l'oggetto CamData const CamData* pCamData = GetCamData( m_pMchLua->m_pGeomDB->GetUserObj( nClEntId)) ; bool bOk = ( pCamData != nullptr) ; bOk = bOk && ( pCamData->GetAxesStatus() == CamData::AS_OK) ; if ( bOk) { DBLVECTOR AxesVal = pCamData->GetAxesVal() ; LuaSetParam( L, AxesVal) ; } else LuaSetParam( L) ; return 1 ; } //---------------------------------------------------------------------------- int Machine::LuaEmtGetBackAuxDir( lua_State* L) { // 1 parametro : nClEntId int nClEntId ; LuaCheckParam( L, 1, nClEntId) LuaClearStack( L) ; // verifico ci sia una macchina attiva valida if ( m_pMchLua == nullptr || m_pMchLua->m_pMchMgr == nullptr || m_pMchLua->m_pGeomDB == nullptr) return luaL_error( L, " Unknown Machine") ; // recupero l'oggetto CamData const CamData* pCamData = GetCamData( m_pMchLua->m_pGeomDB->GetUserObj( nClEntId)) ; bool bOk = ( pCamData != nullptr) ; bOk = bOk && ( pCamData->GetAxesStatus() == CamData::AS_OK) ; if ( bOk) { const Vector3d& vtBackAuxDir = pCamData->GetBackAuxDir() ; LuaSetParam( L, vtBackAuxDir) ; } else LuaSetParam( L) ; return 1 ; } //---------------------------------------------------------------------------- int Machine::LuaEmtAdjustConcavePartsInPath( lua_State* L) { bool bOk = true ; // 3 parametri : nPathId, nAuxPathId, dRad int nPathId ; LuaCheckParam( L, 1, nPathId) int nAuxPathId ; LuaCheckParam( L, 2, nAuxPathId) double dRad ; LuaCheckParam( L, 3, dRad) LuaClearStack( L) ; IGeomDB* pGeomDB = m_pMchLua->m_pGeomDB ; int nId = pGeomDB->GetFirstInGroup( nPathId) ; int nIdCrvAux = pGeomDB->GetFirstInGroup( nAuxPathId) ; const ICurveComposite* pCrvAux = GetCurveComposite( pGeomDB->GetGeoObj(nIdCrvAux)) ; if ( pCrvAux == nullptr) return GDB_ID_NULL ; int nFirstCrvOffset = nId ; OFFSETSEGVEC vOffsetCrvs ; while ( nId != GDB_ID_NULL) { if ( pGeomDB->GetGeoType( nId) == CRV_LINE) { const ICurve* pCrv = GetCurve( pGeomDB->GetGeoObj( nId)) ; int nParent = -1 ; int nDerivFrom = - 1 ; pGeomDB->GetInfo( nId, "DerivFrom", nDerivFrom) ; const IGeoVector3d* pGV = GetGeoVector3d( pGeomDB->GetGeoObj( nDerivFrom)) ; if ( pGV != nullptr) { Point3d ptBase = pGV->GetBase() ; double dPar = 0 ; if ( pCrvAux->GetParamAtPoint( ptBase, dPar)) nParent = int( round( dPar)) - 1 ; } int nFlagAng = 0 ; pGeomDB->GetInfo( nId, "FlgAng", nFlagAng) ; vOffsetCrvs.emplace_back( pCrv->Clone(), nFlagAng, nParent) ; } nId = pGeomDB->GetNext( nId) ; } EDITCRVINFOVEC vEditInfo ; if ( ! CalcAdjustConcavePartsInPath( pCrvAux, vOffsetCrvs, dRad, vEditInfo)) return GDB_ID_NULL ; // applico le modifiche calcolate for ( int i = 0 ; i < ssize( vEditInfo) ; ++i) { if ( vEditInfo[i].nFlag == EditCrvInfo::NOEDIT) continue ; else if ( vEditInfo[i].nFlag == EditCrvInfo::DEL) { pGeomDB->Erase( nFirstCrvOffset + i) ; } else if ( vEditInfo[i].nFlag == EditCrvInfo::EDIT) { if ( vEditInfo[i].ptStart.IsValid()) { ICurveLine* pCL = GetCurveLine( pGeomDB->GetGeoObj( nFirstCrvOffset + i)) ; pCL->ModifyStart( vEditInfo[i].ptStart) ; } if ( vEditInfo[i].ptEnd.IsValid()) { ICurveLine* pCL = GetCurveLine( pGeomDB->GetGeoObj( nFirstCrvOffset + i)) ; pCL->ModifyEnd( vEditInfo[i].ptEnd) ; CamData* camData = GetCamData( pGeomDB->GetUserObj( nFirstCrvOffset + i)) ; camData->SetEndPoint( vEditInfo[i].ptEnd) ; } } } // scorro tutto il vettore delle linee di offset e unisco aggiungendo una linea dove ne ho cancellate for ( int i = 0 ; i < ssize( vEditInfo) - 1 ; ++i) { if ( vEditInfo[i].nFlag == EditCrvInfo::DEL || ( vEditInfo[i].nFlag == EditCrvInfo::NOEDIT)) continue ; int nPrevId = nFirstCrvOffset + i ; int c = i + 1 ; // scorro finché trovo la successiva modificata while ( c < ssize( vEditInfo) && vEditInfo[c].nFlag == EditCrvInfo::DEL || vEditInfo[c].nFlag == EditCrvInfo::NOEDIT) ++c ; if ( vEditInfo[c].nFlag != EditCrvInfo::EDIT) return GDB_ID_NULL ; int nNextId = nFirstCrvOffset + c ; Point3d ptEndCurr, ptStartNext ; if ( vEditInfo[i].ptEnd.IsValid()) ptEndCurr = vEditInfo[i].ptEnd ; else vOffsetCrvs[i].pCrv->GetEndPoint( ptEndCurr) ; if ( vEditInfo[c].ptStart.IsValid()) ptStartNext = vEditInfo[c].ptStart ; else vOffsetCrvs[c].pCrv->GetStartPoint( ptStartNext) ; if ( ! AreSamePointApprox( ptEndCurr, ptStartNext)) { // giunto questi due punti ICurveLine* pCLprev = GetCurveLine( pGeomDB->GetGeoObj( nPrevId)) ; Point3d ptIni = pCLprev->GetEnd() ; ICurveLine* pCLnext = GetCurveLine( pGeomDB->GetGeoObj( nNextId)) ; Point3d ptFin = pCLnext->GetStart() ; const CamData* camDataPrev = GetCamData( pGeomDB->GetUserObj( nPrevId)) ; const CamData* camDataNext = GetCamData( pGeomDB->GetUserObj( nNextId)) ; Vector3d vtTool = Media( camDataPrev->GetToolDir(), camDataNext->GetToolDir()) ; Vector3d vtCorr = Media( camDataPrev->GetCorrDir(), camDataNext->GetCorrDir()) ; Vector3d vtAux = Media( camDataPrev->GetAuxDir(), camDataNext->GetAuxDir()) ; double dFeed = camDataPrev->GetFeed() ; int nFlag = camDataPrev->GetFlag() ; int nFlag2 = camDataPrev->GetFlag2() ; bool bToolShow = camDataPrev->GetToolShow() ; AddLinearMove( ptIni, ptFin, pGeomDB, nPathId, vtTool, vtCorr, vtAux, dFeed, nFlag, nFlag2, bToolShow, nPrevId) ; } i = c ; } LuaSetParam( L, bOk) ; return 1 ; }