diff --git a/Mesh/Makefile b/Mesh/Makefile index 5cef9c9845cee1c2226bfb68936720b407a25ebb..bab0d6ba3e152ff3d40669d48030e7c5bb9da694 100644 --- a/Mesh/Makefile +++ b/Mesh/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.148 2006-11-27 01:33:28 geuzaine Exp $ +# $Id: Makefile,v 1.149 2006-11-27 01:34:59 geuzaine Exp $ # # Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle # @@ -100,6 +100,21 @@ meshGEdge.o: meshGEdge.cpp ../Common/Gmsh.h ../Common/Message.h \ ../Geo/ExtrudeParams.h ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h \ ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h \ ../Geo/SVector3.h ../Geo/Pair.h ../Geo/ExtrudeParams.h BackgroundMesh.h +meshGEdgeExtruded.o: meshGEdgeExtruded.cpp ../Geo/ExtrudeParams.h \ + ../Geo/GModel.h ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h \ + ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h \ + ../Common/GmshDefines.h ../Geo/MVertex.h ../Geo/SPoint3.h \ + ../Geo/GPoint.h ../Geo/SPoint2.h ../Geo/GEdge.h ../Geo/GEntity.h \ + ../Geo/GVertex.h ../Geo/SVector3.h ../Geo/SPoint3.h ../Geo/SPoint3.h \ + ../Geo/SPoint2.h ../Geo/MElement.h ../Geo/MVertex.h ../Geo/MEdge.h \ + ../Geo/MVertex.h ../Geo/SVector3.h ../Common/Hash.h ../Geo/MFace.h \ + ../Geo/MVertex.h ../Geo/SVector3.h ../Numeric/Numeric.h \ + ../Common/Context.h ../DataStr/List.h ../Geo/ExtrudeParams.h \ + ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h ../Geo/GEdgeLoop.h \ + ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h ../Geo/SVector3.h \ + ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/GRegion.h ../Geo/GEntity.h \ + ../Geo/MElement.h ../Geo/ExtrudeParams.h ../Geo/SBoundingBox3d.h \ + ../Common/SmoothNormals.h ../Common/Message.h meshGFace.o: meshGFace.cpp meshGFace.h DivideAndConquer.h \ BackgroundMesh.h ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h \ ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h \ @@ -132,24 +147,40 @@ meshGFaceTransfinite.o: meshGFaceTransfinite.cpp meshGFace.h \ ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h \ ../Geo/SVector3.h ../Geo/Pair.h ../Geo/ExtrudeParams.h \ ../Common/Message.h -meshGRegion.o: meshGRegion.cpp meshGRegion.h ../Geo/GModel.h \ - ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \ - ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Common/GmshDefines.h \ - ../Geo/MVertex.h ../Geo/SPoint3.h ../Geo/GPoint.h ../Geo/SPoint2.h \ - ../Geo/GEdge.h ../Geo/GEntity.h ../Geo/GVertex.h ../Geo/SVector3.h \ - ../Geo/SPoint3.h ../Geo/SPoint3.h ../Geo/SPoint2.h ../Geo/MElement.h \ - ../Geo/MVertex.h ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h \ +meshGFaceExtruded.o: meshGFaceExtruded.cpp ../Geo/ExtrudeParams.h \ + ../Geo/GModel.h ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h \ + ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h \ + ../Common/GmshDefines.h ../Geo/MVertex.h ../Geo/SPoint3.h \ + ../Geo/GPoint.h ../Geo/SPoint2.h ../Geo/GEdge.h ../Geo/GEntity.h \ + ../Geo/GVertex.h ../Geo/SVector3.h ../Geo/SPoint3.h ../Geo/SPoint3.h \ + ../Geo/SPoint2.h ../Geo/MElement.h ../Geo/MVertex.h ../Geo/MEdge.h \ + ../Geo/MVertex.h ../Geo/SVector3.h ../Common/Hash.h ../Geo/MFace.h \ + ../Geo/MVertex.h ../Geo/SVector3.h ../Numeric/Numeric.h \ + ../Common/Context.h ../DataStr/List.h ../Geo/ExtrudeParams.h \ + ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h ../Geo/GEdgeLoop.h \ + ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h ../Geo/SVector3.h \ + ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/GRegion.h ../Geo/GEntity.h \ + ../Geo/MElement.h ../Geo/ExtrudeParams.h ../Geo/SBoundingBox3d.h \ + ../Common/SmoothNormals.h ../Common/Message.h +meshGRegion.o: meshGRegion.cpp meshGRegion.h \ + meshGRegionDelaunayInsertion.h ../Geo/MElement.h \ + ../Common/GmshDefines.h ../Geo/MVertex.h ../Geo/SPoint3.h \ + ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h ../Geo/SPoint3.h \ ../Common/Hash.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \ ../Numeric/Numeric.h ../Common/Context.h ../DataStr/List.h \ - ../Geo/ExtrudeParams.h ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h \ - ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h \ - ../Geo/SVector3.h ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/GRegion.h \ - ../Geo/GEntity.h ../Geo/MElement.h ../Geo/ExtrudeParams.h \ - ../Geo/SBoundingBox3d.h ../Common/SmoothNormals.h ../Geo/MRep.h \ - ../Geo/GEdge.h ../Geo/GFace.h ../Geo/GRegion.h ../Geo/MVertex.h \ - ../Geo/MEdge.h ../Geo/MElement.h ../Common/VertexArray.h \ - ../Common/Message.h ../Common/OS.h BDS.h ../Common/Views.h \ - ../Common/ColorTable.h ../Common/VertexArray.h \ + ../Geo/GModel.h ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h \ + ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h \ + ../Geo/MVertex.h ../Geo/GPoint.h ../Geo/SPoint2.h ../Geo/GEdge.h \ + ../Geo/GEntity.h ../Geo/GVertex.h ../Geo/SVector3.h ../Geo/SPoint3.h \ + ../Geo/SPoint2.h ../Geo/MElement.h ../Geo/ExtrudeParams.h \ + ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h ../Geo/GEdgeLoop.h \ + ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h ../Geo/SVector3.h \ + ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/GRegion.h ../Geo/GEntity.h \ + ../Geo/MElement.h ../Geo/ExtrudeParams.h ../Geo/SBoundingBox3d.h \ + ../Common/SmoothNormals.h ../Geo/MRep.h ../Geo/GEdge.h ../Geo/GFace.h \ + ../Geo/GRegion.h ../Geo/MVertex.h ../Geo/MEdge.h ../Geo/MElement.h \ + ../Common/VertexArray.h ../Common/Message.h ../Common/OS.h BDS.h \ + ../Common/Views.h ../Common/ColorTable.h ../Common/VertexArray.h \ ../Common/SmoothNormals.h ../Common/AdaptiveViews.h \ ../Common/GmshMatrix.h meshGRegionDelaunayInsertion.o: meshGRegionDelaunayInsertion.cpp \ diff --git a/Mesh/meshGEdgeExtruded.cpp b/Mesh/meshGEdgeExtruded.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d7dc8bba79ebfe1696089f4be3e201fb2a9492ca --- /dev/null +++ b/Mesh/meshGEdgeExtruded.cpp @@ -0,0 +1,93 @@ +// $Id: meshGEdgeExtruded.cpp,v 1.1 2006-11-27 01:34:59 geuzaine Exp $ +// +// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems to <gmsh@geuz.org>. + +#include <set> +#include "ExtrudeParams.h" +#include "GModel.h" +#include "Message.h" + +void extrudeMesh(GVertex *from, GEdge *to) +{ + ExtrudeParams *ep = to->meshAttributes.extrude; + + // create vertices + MVertex *v = from->mesh_vertices[0]; + for(int j = 0; j < ep->mesh.NbLayer; j++) { + for(int k = 0; k < ep->mesh.NbElmLayer[j]; k++) { + double x = v->x(), y = v->y(), z = v->z(); + ep->Extrude(j, k + 1, x, y, z); + if(j != ep->mesh.NbLayer - 1 || k != ep->mesh.NbElmLayer[j] - 1) + to->mesh_vertices.push_back(new MEdgeVertex(x, y, z, to, ep->u(j, k))); + } + } +} + +void copyMesh(GEdge *from, GEdge *to, int direction) +{ + ExtrudeParams *ep = to->meshAttributes.extrude; + + Range<double> u_bounds = from->parBounds(0); + double u_min = u_bounds.low(); + double u_max = u_bounds.high(); + + // create vertices + for(unsigned int i = 0; i < from->mesh_vertices.size(); i++){ + int index = (direction < 0) ? (from->mesh_vertices.size() - 1 - i) : i; + MVertex *v = from->mesh_vertices[index]; + double x = v->x(), y = v->y(), z = v->z(); + ep->Extrude(ep->mesh.NbLayer - 1, ep->mesh.NbElmLayer[ep->mesh.NbLayer - 1], + x, y, z); + double u; + v->getParameter(0, u); + double newu = (direction > 0) ? u : (u_max - u + u_min); + to->mesh_vertices.push_back(new MEdgeVertex(x, y, z, to, newu)); + } +} + +int MeshExtrudedCurve(GEdge *ge) +{ + ExtrudeParams *ep = ge->meshAttributes.extrude; + + if(!ep || !ep->mesh.ExtrudeMesh) + return 0; + + if(ep->geo.Mode == EXTRUDED_ENTITY) { + // curve is extruded from a point + extrudeMesh(ge->getBeginVertex(), ge); + } + else { + // curve is a copy of another curve ("chapeau") + GEdge *from = ge->model()->edgeByTag(std::abs(ep->geo.Source)); + if(!from) return 0; + copyMesh(from, ge, (ep->geo.Source > 0) ? 1 : -1); + } + + // create elements + for(unsigned int i = 0; i < ge->mesh_vertices.size() + 1; i++){ + MVertex *v0 = (i == 0) ? + ge->getBeginVertex()->mesh_vertices[0] : ge->mesh_vertices[i - 1]; + MVertex *v1 = (i == ge->mesh_vertices.size()) ? + ge->getEndVertex()->mesh_vertices[0] : ge->mesh_vertices[i]; + ge->lines.push_back(new MLine(v0, v1)); + } + + return 1; +}