void Builder::FinalizeAnyPolyline() { // Save the last polyline / polygon if one exists. if ( current_polyline_pointcount > 0 ) { if ( current_polyline_willclose ) { polyVertex << DL_VertexData( closePolyX, closePolyY, closePolyZ ); } int dim = polyVertex.size(); QVector<double> xv( dim ); QVector<double> yv( dim ); QVector<double> zv( dim ); for ( int i = 0; i < dim; i++ ) { xv[i] = polyVertex[i].x; yv[i] = polyVertex[i].y; zv[i] = polyVertex[i].z; } shpObjects << SHPCreateObject( shapefileType, shpObjects.size(), 0, NULL, NULL, dim, xv.data(), yv.data(), zv.data(), NULL ); polyVertex.clear(); QgsDebugMsg( QString( "Finalized adding of polyline shape %1" ).arg( shpObjects.size() - 1 ) ); current_polyline_pointcount = 0; } }
void Builder::addCircle( const DL_CircleData& data ) { if ( shapefileType != SHPT_ARC && shapefileType != SHPT_POLYGON ) { QgsDebugMsg( "ignoring circle" ); return; } QgsDebugMsg( QString( "circle (%1,%2,%3 r=%4)" ).arg( data.cx ).arg( data.cy ).arg( data.cz ).arg( data.radius ) ); if ( ignoringBlock ) { QgsDebugMsg( "skipping circle in block" ); return; } std::vector <DL_PointData> circlePoints; DL_PointData myPoint; // Approximate the circle with 360 line segments connecting points along that circle long shpIndex = 0; for ( double i = 0.0; i <= 2*M_PI; i += M_PI / 180.0, shpIndex++ ) { myPoint.x = data.radius * cos( i ) + data.cx; myPoint.y = data.radius * sin( i ) + data.cy; myPoint.z = data.cz; circlePoints.push_back( myPoint ); } int dim = circlePoints.size(); QVector<double> xv( dim ); QVector<double> yv( dim ); QVector<double> zv( dim ); for ( int i = 0; i < dim; i++ ) { xv[i] = circlePoints[i].x; yv[i] = circlePoints[i].y; zv[i] = circlePoints[i].z; } shpObjects << SHPCreateObject( shapefileType, shpObjects.size(), 0, NULL, NULL, dim, xv.data(), yv.data(), zv.data(), NULL ); circlePoints.clear(); }
void Builder::addPolyline( const DL_PolylineData& data ) { if ( shapefileType != SHPT_ARC && shapefileType != SHPT_POLYGON ) { QgsDebugMsg( "ignoring polyline" ); return; } QgsDebugMsg( "reading polyline - expecting vertices" ); if ( ignoringBlock ) { QgsDebugMsg( "skipping polyline in block" ); return; } // Add previously created polyline if not finalized yet if ( current_polyline_pointcount > 0 ) { if ( current_polyline_willclose ) { DL_VertexData myVertex; myVertex.x = closePolyX; myVertex.y = closePolyY; myVertex.z = closePolyZ; polyVertex.push_back( myVertex ); } int dim = polyVertex.size(); QVector<double> xv( dim ); QVector<double> yv( dim ); QVector<double> zv( dim ); for ( int i = 0; i < dim; i++ ) { xv[i] = polyVertex[i].x; yv[i] = polyVertex[i].y; zv[i] = polyVertex[i].z; } shpObjects << SHPCreateObject( shapefileType, shpObjects.size(), 0, NULL, NULL, dim, xv.data(), yv.data(), zv.data(), NULL ); polyVertex.clear(); QgsDebugMsg( QString( "polyline prepared: %1" ).arg( shpObjects.size() - 1 ) ); current_polyline_pointcount = 0; } // Now that the currently-adding polyline (if any) is // finalized, parse out the flag options if ( data.flags == 1 || data.flags == 32 ) { current_polyline_willclose = true; store_next_vertex_for_polyline_close = true; } else { current_polyline_willclose = false; store_next_vertex_for_polyline_close = false; } current_polyline_pointcount = 0; }
void Builder::addArc( const DL_ArcData& data ) { if ( shapefileType != SHPT_ARC ) { QgsDebugMsg( "ignoring arc" ); return; } int fromAngle = ( int ) data.angle1 + 1; int toAngle = ( int ) data.angle2 + 1; QgsDebugMsg( QString( "arc (%1,%2,%3 r=%4 a1=%5 a2=%6)" ) .arg( data.cx ).arg( data.cy ).arg( data.cz ) .arg( data.radius ) .arg( data.angle1 ).arg( data.angle2 ) ); if ( ignoringBlock ) { QgsDebugMsg( "skipping arc in block" ); return; } int i = 0; long shpIndex = 0; // Approximate the arc double radianMeasure; std::vector <DL_PointData> arcPoints; DL_PointData myPoint; for ( i = fromAngle; ; i++, shpIndex++ ) { if ( i > 360 ) i = 0; if ( shpIndex > 1000 ) break; radianMeasure = i * M_PI / 180.0; myPoint.x = data.radius * cos( radianMeasure ) + data.cx; myPoint.y = data.radius * sin( radianMeasure ) + data.cy; myPoint.z = data.cz; arcPoints.push_back( myPoint ); if ( i == toAngle ) break; } // Finalize int dim = arcPoints.size(); QVector<double> xv( dim ); QVector<double> yv( dim ); QVector<double> zv( dim ); for ( int i = 0; i < dim; i++ ) { xv[i] = arcPoints[i].x; yv[i] = arcPoints[i].y; zv[i] = arcPoints[i].z; } shpObjects << SHPCreateObject( shapefileType, shpObjects.size(), 0, NULL, NULL, dim, xv.data(), yv.data(), zv.data(), NULL ); arcPoints.clear(); }
void SMDImporter::CreateAnimationSource() { XSI::ActionSource actionSource; float animStart = 9999; float animEnd = -9999; XSI::CString animatedObjects; for (int c=0;c<m_pNodes.GetUsed();c++) { SMDNode* node = m_pNodes[c]; if ( node->m_pKeys.GetUsed() > 1 ) { if ( !actionSource.IsValid() ) { LPWSTR l_wszActionName; DSA2W(&l_wszActionName,m_szActionName); actionSource = m_pModel.AddActionSource( l_wszActionName ); } XSI::Parameter x = node->m_x3d.GetParameters().GetItem( L"posx" ); XSI::Parameter y = node->m_x3d.GetParameters().GetItem( L"posy" ); XSI::Parameter z = node->m_x3d.GetParameters().GetItem( L"posz" ); XSI::Parameter rx = node->m_x3d.GetParameters().GetItem( L"rotx" ); XSI::Parameter ry = node->m_x3d.GetParameters().GetItem( L"roty" ); XSI::Parameter rz = node->m_x3d.GetParameters().GetItem( L"rotz" ); node->m_fOldX = x.GetValue(); node->m_fOldY = y.GetValue(); node->m_fOldZ = z.GetValue(); node->m_fOldRX = rx.GetValue(); node->m_fOldRY = ry.GetValue(); node->m_fOldRZ = rz.GetValue(); XSI::FCurve fcrvx; x.AddFCurve( XSI::siStandardFCurve, fcrvx ); XSI::FCurve fcrvy; y.AddFCurve( XSI::siStandardFCurve, fcrvy ); XSI::FCurve fcrvz; z.AddFCurve( XSI::siStandardFCurve, fcrvz ); XSI::FCurve fcrvrx; rx.AddFCurve( XSI::siStandardFCurve, fcrvrx ); XSI::FCurve fcrvry; ry.AddFCurve( XSI::siStandardFCurve, fcrvry ); XSI::FCurve fcrvrz; rz.AddFCurve( XSI::siStandardFCurve, fcrvrz ); XSI::CTimeArray time(node->m_pKeys.GetUsed()); XSI::CValueArray xv(node->m_pKeys.GetUsed()); XSI::CValueArray yv(node->m_pKeys.GetUsed()); XSI::CValueArray zv(node->m_pKeys.GetUsed()); XSI::CValueArray rxv(node->m_pKeys.GetUsed()); XSI::CValueArray ryv(node->m_pKeys.GetUsed()); XSI::CValueArray rzv(node->m_pKeys.GetUsed()); if ( node->m_pParent ==NULL ) { for (int k=0;k<node->m_pKeys.GetUsed();k++) { if ( node->GetKey(k)->m_fTime < animStart ) { animStart = node->GetKey(k)->m_fTime; } if ( node->GetKey(k)->m_fTime > animEnd ) { animEnd = node->GetKey(k)->m_fTime; } XSI::MATH::CTransformation xfo1; XSI::MATH::CTransformation xfo2; xfo1.SetRotationFromXYZAnglesValues ( node->GetKey(k)->m_vRotation.GetX(), node->GetKey(k)->m_vRotation.GetY(), node->GetKey(k)->m_vRotation.GetZ() ); xfo1.SetTranslationFromValues ( node->GetKey(k)->m_vPosition.GetX(), node->GetKey(k)->m_vPosition.GetY(), node->GetKey(k)->m_vPosition.GetZ() ); xfo2.SetRotationFromXYZAnglesValues ( -1.570796, 0.0, 0.0 ); xfo1.MulInPlace(xfo2); double dx,dy,dz; double drx, dry, drz; xfo1.GetTranslationValues ( dx, dy, dz); xfo1.GetRotationFromXYZAnglesValues(drx, dry, drz); time[k] = k; xv[k] = dx; yv[k] = dy; zv[k] = dz; rxv[k] = drx * 57.29577951308232286465; ryv[k] = dry * 57.29577951308232286465; rzv[k] = drz * 57.29577951308232286465; } } else { for (int k=0;k<node->m_pKeys.GetUsed();k++) { if ( node->GetKey(k)->m_fTime < animStart ) { animStart = node->GetKey(k)->m_fTime; } if ( node->GetKey(k)->m_fTime > animEnd ) { animEnd = node->GetKey(k)->m_fTime; } time[k] = k; xv[k] = node->GetKey(k)->m_vPosition.GetX(); yv[k] = node->GetKey(k)->m_vPosition.GetY(); zv[k] = node->GetKey(k)->m_vPosition.GetZ(); rxv[k] = node->GetKey(k)->m_vRotation.GetX() * 57.29577951308232286465; ryv[k] = node->GetKey(k)->m_vRotation.GetY() * 57.29577951308232286465; rzv[k] = node->GetKey(k)->m_vRotation.GetZ() * 57.29577951308232286465; } } fcrvx.SetKeys ( time, xv ); fcrvy.SetKeys ( time, yv ); fcrvz.SetKeys ( time, zv ); fcrvrx.SetKeys ( time, rxv ); fcrvry.SetKeys ( time, ryv ); fcrvrz.SetKeys ( time, rzv ); LPWSTR l_wszModelName; DSA2W(&l_wszModelName,FixName(node->m_szName)); XSI::CString cname = l_wszModelName; actionSource.AddSourceItem ( cname + L".kine.local.posx", fcrvx, true ); actionSource.AddSourceItem ( cname + L".kine.local.posy", fcrvy, true ); actionSource.AddSourceItem ( cname + L".kine.local.posz", fcrvz, true ); actionSource.AddSourceItem ( cname + L".kine.local.rotx", fcrvrx, true ); actionSource.AddSourceItem ( cname + L".kine.local.roty", fcrvry, true ); actionSource.AddSourceItem ( cname + L".kine.local.rotz", fcrvrz, true ); // build up the string list of objects that we want to remove animation from if (animatedObjects.IsEmpty() == false) { animatedObjects += L", "; } animatedObjects += node->m_x3d.GetFullName(); } } if ( actionSource.IsValid() ) { actionSource.PutParameterValue(L"FrameStart", (double)animStart); actionSource.PutParameterValue(L"FrameEnd", (double)animEnd); } // remove animation on all objects that were imported // and animated if (animatedObjects.IsEmpty() == false) { XSI::Application app; XSI::CValue out; XSI::CValueArray args(4); args[0] = animatedObjects; args[1] = XSI::CValue(); args[2] = (long)XSI::siBranch; args[3] = (long)(XSI::siFCurveSource); app.ExecuteCommand(L"RemoveAllAnimation", args, out); } }