// Build outer transformation matrix for the positioning void CCPACSFuselagePositioning::BuildMatrix(void) { // Compose the transformation for the tip section reference point. // The positioning transformation is basically a translation in two steps: // 1. from the fuselage origin to the startPoint (= endPoint of previous positioning) // 2. from the innerPoint to the endPoint with coordinates given // in a "spherical" coordinate system (length, sweepAngle, dihedralAngle). // The original section is neither rotated by sweepAngle nor by dihedralAngle. // Calculate the cartesian translation components for step two from "spherical" input coordinates CTiglTransformation tempTransformation; tempTransformation.SetIdentity(); tempTransformation.AddRotationZ(-sweepangle); tempTransformation.AddRotationX(dihedralangle); gp_Pnt tempPnt = tempTransformation.Transform(gp_Pnt(0.0, length, 0.0)); // Setup transformation combining both steps endTransformation.SetIdentity(); endTransformation.AddTranslation( startPoint.x + tempPnt.X() , startPoint.y + tempPnt.Y() , startPoint.z + tempPnt.Z() ); // calculate outer section point by transforming origin tempPnt = endTransformation.Transform(gp_Pnt(0.0, 0.0, 0.0)); endPoint.x = tempPnt.X(); endPoint.y = tempPnt.Y(); endPoint.z = tempPnt.Z(); }
TopoDS_Wire CCPACSControlSurfaceDeviceAirfoil::GetWire(CTiglControlSurfaceBorderCoordinateSystem& coords) { CCPACSWingProfile& profile =_config->GetWingProfile(_airfoilUID); TopoDS_Wire w = profile.GetWire(); // scale CTiglTransformation scale; scale.AddScaling(coords.getLe().Distance(coords.getTe()), 1, _scalZ); // bring the wire into the coordinate system of // the airfoil by swapping z with y gp_Trsf trafo; trafo.SetTransformation(gp_Ax3(gp_Pnt(0,0,0), gp_Vec(0,-1,0), gp_Vec(1,0,0))); CTiglTransformation flipZY(trafo); // put the airfoil to the correct place CTiglTransformation position(coords.globalTransform()); // compute the total transform CTiglTransformation total; total.PreMultiply(scale); total.PreMultiply(flipZY); total.PreMultiply(position); w = TopoDS::Wire(total.Transform(w)); return w; }
// Save a sequence of shapes in IGES Format void CTiglExportIges::ExportShapes(const ListPNamedShape& shapes, const std::string& filename) const { IGESControl_Controller::Init(); if ( filename.empty()) { LOG(ERROR) << "Error: Empty filename in ExportShapes."; return; } ListPNamedShape::const_iterator it; // scale all shapes to mm ListPNamedShape shapeScaled; for (it = shapes.begin(); it != shapes.end(); ++it) { PNamedShape pshape = *it; if (pshape) { CTiglTransformation trafo; trafo.AddScaling(1000,1000,1000); PNamedShape pScaledShape(new CNamedShape(*pshape)); pScaledShape->SetShape(trafo.Transform(pshape->Shape())); shapeScaled.push_back(pScaledShape); } } ListPNamedShape list; for (it = shapeScaled.begin(); it != shapeScaled.end(); ++it) { ListPNamedShape templist = GroupFaces(*it, _groupMode); for (ListPNamedShape::iterator it2 = templist.begin(); it2 != templist.end(); ++it2) { list.push_back(*it2); } } SetTranslationParameters(); IGESControl_Writer igesWriter("MM", 0); igesWriter.Model()->ApplyStatic(); int level = 0; for (it = list.begin(); it != list.end(); ++it) { PNamedShape pshape = *it; AddToIges(pshape, igesWriter, level++); } igesWriter.ComputeModel(); if (igesWriter.Write(const_cast<char*>(filename.c_str())) != Standard_True) { throw CTiglError("Error: Export of shapes to IGES file failed in CCPACSImportExport::SaveIGES", TIGL_ERROR); } }