Skip to content
Snippets Groups Projects
Commit 7b05a0d6 authored by Christophe Geuzaine's avatar Christophe Geuzaine
Browse files

ported Annotate and HarmonicToTime plugins to new API

parent 5060a9bd
No related branches found
No related tags found
No related merge requests found
......@@ -201,7 +201,8 @@ void GMSH_AnnotatePlugin::getInfos(char *author, char *copyright,
"according to `Align'. If `iView' < 0, the plugin\n"
"is run on the current view.\n"
"\n"
"Plugin(Annotate) is executed in-place.\n");
"Plugin(Annotate) is executed in-place for list-based\n"
"datasets or creates a new view for other datasets.\n");
}
int GMSH_AnnotatePlugin::getNbOptions() const
......@@ -241,29 +242,42 @@ PView *GMSH_AnnotatePlugin::execute(PView *v)
PView *v1 = getView(iView, v);
if(!v1) return v;
PViewData *data1 = v1->getData();
PViewDataList *data1 = getDataList(v1);
if(!data1) return v;
PView *v2 = v1;
PViewDataList *data2 = getDataList(v2, false);
if(!data2){
v2 = new PView();
data2 = getDataList(v2);
}
if(dim3){
data1->T3D.push_back(X);
data1->T3D.push_back(Y);
data1->T3D.push_back(Z);
data1->T3D.push_back(style);
data1->T3D.push_back(data1->T3C.size());
data2->T3D.push_back(X);
data2->T3D.push_back(Y);
data2->T3D.push_back(Z);
data2->T3D.push_back(style);
data2->T3D.push_back(data2->T3C.size());
for(int i = 0; i < (int)strlen(text) + 1; i++)
data1->T3C.push_back(text[i]);
data1->NbT3++;
data2->T3C.push_back(text[i]);
data2->NbT3++;
}
else{
data1->T2D.push_back(X);
data1->T2D.push_back(Y);
data1->T2D.push_back(style);
data1->T2D.push_back(data1->T2C.size());
data2->T2D.push_back(X);
data2->T2D.push_back(Y);
data2->T2D.push_back(style);
data2->T2D.push_back(data2->T2C.size());
for(int i = 0; i < (int)strlen(text) + 1; i++)
data1->T2C.push_back(text[i]);
data1->NbT2++;
data2->T2C.push_back(text[i]);
data2->NbT2++;
}
if(v2 != v1){
for(int i = 0; i < data1->getNumTimeSteps(); i++)
data2->Time.push_back(data1->getTime(i));
data2->setName(data1->getName() + "_Annotate");
data2->setFileName(data1->getName() + "_Annotate.pos");
}
return v1;
data2->finalize();
return v2;
}
......@@ -97,49 +97,49 @@ void GMSH_ExtractPlugin::catchErrorMessage(char *errorMessage) const
strcpy(errorMessage, "Extract failed...");
}
static std::vector<double> *incrementList(PViewDataList *data2, int numComp2,
static std::vector<double> *incrementList(PViewDataList *data, int numComp,
int numEdges)
{
switch(numEdges){
case 0:
if (numComp2 == 1){ data2->NbSP++; return &data2->SP; }
else if(numComp2 == 3){ data2->NbVP++; return &data2->VP; }
else if(numComp2 == 9){ data2->NbTP++; return &data2->TP; }
if (numComp == 1){ data->NbSP++; return &data->SP; }
else if(numComp == 3){ data->NbVP++; return &data->VP; }
else if(numComp == 9){ data->NbTP++; return &data->TP; }
break;
case 1:
if (numComp2 == 1){ data2->NbSL++; return &data2->SL; }
else if(numComp2 == 3){ data2->NbVL++; return &data2->VL; }
else if(numComp2 == 9){ data2->NbTL++; return &data2->TL; }
if (numComp == 1){ data->NbSL++; return &data->SL; }
else if(numComp == 3){ data->NbVL++; return &data->VL; }
else if(numComp == 9){ data->NbTL++; return &data->TL; }
break;
case 3:
if (numComp2 == 1){ data2->NbST++; return &data2->ST; }
else if(numComp2 == 3){ data2->NbVT++; return &data2->VT; }
else if(numComp2 == 9){ data2->NbTT++; return &data2->TT; }
if (numComp == 1){ data->NbST++; return &data->ST; }
else if(numComp == 3){ data->NbVT++; return &data->VT; }
else if(numComp == 9){ data->NbTT++; return &data->TT; }
break;
case 4:
if (numComp2 == 1){ data2->NbSQ++; return &data2->SQ; }
else if(numComp2 == 3){ data2->NbVQ++; return &data2->VQ; }
else if(numComp2 == 9){ data2->NbTQ++; return &data2->TQ; }
if (numComp == 1){ data->NbSQ++; return &data->SQ; }
else if(numComp == 3){ data->NbVQ++; return &data->VQ; }
else if(numComp == 9){ data->NbTQ++; return &data->TQ; }
break;
case 6:
if (numComp2 == 1){ data2->NbSS++; return &data2->SS; }
else if(numComp2 == 3){ data2->NbVS++; return &data2->VS; }
else if(numComp2 == 9){ data2->NbTS++; return &data2->TS; }
if (numComp == 1){ data->NbSS++; return &data->SS; }
else if(numComp == 3){ data->NbVS++; return &data->VS; }
else if(numComp == 9){ data->NbTS++; return &data->TS; }
break;
case 12:
if (numComp2 == 1){ data2->NbSH++; return &data2->SH; }
else if(numComp2 == 3){ data2->NbVH++; return &data2->VH; }
else if(numComp2 == 9){ data2->NbTH++; return &data2->TH; }
if (numComp == 1){ data->NbSH++; return &data->SH; }
else if(numComp == 3){ data->NbVH++; return &data->VH; }
else if(numComp == 9){ data->NbTH++; return &data->TH; }
break;
case 9:
if (numComp2 == 1){ data2->NbSI++; return &data2->SI; }
else if(numComp2 == 3){ data2->NbVI++; return &data2->VI; }
else if(numComp2 == 9){ data2->NbTI++; return &data2->TI; }
if (numComp == 1){ data->NbSI++; return &data->SI; }
else if(numComp == 3){ data->NbVI++; return &data->VI; }
else if(numComp == 9){ data->NbTI++; return &data->TI; }
break;
case 8:
if (numComp2 == 1){ data2->NbSY++; return &data2->SY; }
else if(numComp2 == 3){ data2->NbVY++; return &data2->VY; }
else if(numComp2 == 9){ data2->NbTY++; return &data2->TY; }
if (numComp == 1){ data->NbSY++; return &data->SY; }
else if(numComp == 3){ data->NbVY++; return &data->VY; }
else if(numComp == 9){ data->NbTY++; return &data->TY; }
break;
}
return 0;
......
......@@ -20,12 +20,6 @@ extern "C"
}
}
GMSH_HarmonicToTimePlugin::GMSH_HarmonicToTimePlugin()
{
;
}
void GMSH_HarmonicToTimePlugin::getName(char *name) const
{
strcpy(name, "Harmonic to Time");
......@@ -64,30 +58,52 @@ void GMSH_HarmonicToTimePlugin::catchErrorMessage(char *errorMessage) const
strcpy(errorMessage, "HarmonicToTime failed...");
}
static void h2t(int nb1, std::vector<double> &list1,
int *nb2, std::vector<double> &list2,
int nbNod, int nbComp, int rIndex, int iIndex, int nSteps)
static std::vector<double> *incrementList(PViewDataList *data, int numComp,
int numEdges)
{
if(!nb1) return;
int nb = list1.size() / nb1;
for(unsigned int i = 0; i < list1.size(); i += nb) {
for(int j = 0; j < 3 * nbNod; j++)
list2.push_back(list1[i + j]);
double *valr = &list1[i + 3 * nbNod + nbNod * nbComp * rIndex];
double *vali = &list1[i + 3 * nbNod + nbNod * nbComp * iIndex];
for(int t = 0; t < nSteps; t++) {
double p = 2. * M_PI * t / nSteps;
for(int j = 0; j < nbNod; j++) {
for(int k = 0; k < nbComp; k++) {
double val = valr[nbComp * j + k] * cos(p) - vali[nbComp * j + k] * sin(p);
list2.push_back(val);
}
}
}
}
*nb2 = nb1;
switch(numEdges){
case 0:
if (numComp == 1){ data->NbSP++; return &data->SP; }
else if(numComp == 3){ data->NbVP++; return &data->VP; }
else if(numComp == 9){ data->NbTP++; return &data->TP; }
break;
case 1:
if (numComp == 1){ data->NbSL++; return &data->SL; }
else if(numComp == 3){ data->NbVL++; return &data->VL; }
else if(numComp == 9){ data->NbTL++; return &data->TL; }
break;
case 3:
if (numComp == 1){ data->NbST++; return &data->ST; }
else if(numComp == 3){ data->NbVT++; return &data->VT; }
else if(numComp == 9){ data->NbTT++; return &data->TT; }
break;
case 4:
if (numComp == 1){ data->NbSQ++; return &data->SQ; }
else if(numComp == 3){ data->NbVQ++; return &data->VQ; }
else if(numComp == 9){ data->NbTQ++; return &data->TQ; }
break;
case 6:
if (numComp == 1){ data->NbSS++; return &data->SS; }
else if(numComp == 3){ data->NbVS++; return &data->VS; }
else if(numComp == 9){ data->NbTS++; return &data->TS; }
break;
case 12:
if (numComp == 1){ data->NbSH++; return &data->SH; }
else if(numComp == 3){ data->NbVH++; return &data->VH; }
else if(numComp == 9){ data->NbTH++; return &data->TH; }
break;
case 9:
if (numComp == 1){ data->NbSI++; return &data->SI; }
else if(numComp == 3){ data->NbVI++; return &data->VI; }
else if(numComp == 9){ data->NbTI++; return &data->TI; }
break;
case 8:
if (numComp == 1){ data->NbSY++; return &data->SY; }
else if(numComp == 3){ data->NbVY++; return &data->VY; }
else if(numComp == 9){ data->NbTY++; return &data->TY; }
break;
}
return 0;
}
PView *GMSH_HarmonicToTimePlugin::execute(PView * v)
......@@ -99,9 +115,12 @@ PView *GMSH_HarmonicToTimePlugin::execute(PView * v)
PView *v1 = getView(iView, v);
if(!v1) return v;
PViewData *data1 = v1->getData();
PViewDataList *data1 = getDataList(v1);
if(!data1) return v;
if(data1->hasMultipleMeshes()){
Msg::Error("HarmonicToTime plugin cannot be applied to multi-mesh views");
return v1;
}
if(rIndex < 0 || rIndex >= data1->getNumTimeSteps() ||
iIndex < 0 || iIndex >= data1->getNumTimeSteps()){
......@@ -115,34 +134,39 @@ PView *GMSH_HarmonicToTimePlugin::execute(PView * v)
}
PView *v2 = new PView();
PViewDataList *data2 = getDataList(v2);
if(!data2) return v;
h2t(data1->NbSP, data1->SP, &data2->NbSP, data2->SP, 1, 1, rIndex, iIndex, nSteps);
h2t(data1->NbVP, data1->VP, &data2->NbVP, data2->VP, 1, 3, rIndex, iIndex, nSteps);
h2t(data1->NbTP, data1->TP, &data2->NbTP, data2->TP, 1, 9, rIndex, iIndex, nSteps);
h2t(data1->NbSL, data1->SL, &data2->NbSL, data2->SL, 2, 1, rIndex, iIndex, nSteps);
h2t(data1->NbVL, data1->VL, &data2->NbVL, data2->VL, 2, 3, rIndex, iIndex, nSteps);
h2t(data1->NbTL, data1->TL, &data2->NbTL, data2->TL, 2, 9, rIndex, iIndex, nSteps);
h2t(data1->NbST, data1->ST, &data2->NbST, data2->ST, 3, 1, rIndex, iIndex, nSteps);
h2t(data1->NbVT, data1->VT, &data2->NbVT, data2->VT, 3, 3, rIndex, iIndex, nSteps);
h2t(data1->NbTT, data1->TT, &data2->NbTT, data2->TT, 3, 9, rIndex, iIndex, nSteps);
h2t(data1->NbSQ, data1->SQ, &data2->NbSQ, data2->SQ, 4, 1, rIndex, iIndex, nSteps);
h2t(data1->NbVQ, data1->VQ, &data2->NbVQ, data2->VQ, 4, 3, rIndex, iIndex, nSteps);
h2t(data1->NbTQ, data1->TQ, &data2->NbTQ, data2->TQ, 4, 9, rIndex, iIndex, nSteps);
h2t(data1->NbSS, data1->SS, &data2->NbSS, data2->SS, 4, 1, rIndex, iIndex, nSteps);
h2t(data1->NbVS, data1->VS, &data2->NbVS, data2->VS, 4, 3, rIndex, iIndex, nSteps);
h2t(data1->NbTS, data1->TS, &data2->NbTS, data2->TS, 4, 9, rIndex, iIndex, nSteps);
h2t(data1->NbSH, data1->SH, &data2->NbSH, data2->SH, 8, 1, rIndex, iIndex, nSteps);
h2t(data1->NbVH, data1->VH, &data2->NbVH, data2->VH, 8, 3, rIndex, iIndex, nSteps);
h2t(data1->NbTH, data1->TH, &data2->NbTH, data2->TH, 8, 9, rIndex, iIndex, nSteps);
h2t(data1->NbSI, data1->SI, &data2->NbSI, data2->SI, 6, 1, rIndex, iIndex, nSteps);
h2t(data1->NbVI, data1->VI, &data2->NbVI, data2->VI, 6, 3, rIndex, iIndex, nSteps);
h2t(data1->NbTI, data1->TI, &data2->NbTI, data2->TI, 6, 9, rIndex, iIndex, nSteps);
h2t(data1->NbSY, data1->SY, &data2->NbSY, data2->SY, 5, 1, rIndex, iIndex, nSteps);
h2t(data1->NbVY, data1->VY, &data2->NbVY, data2->VY, 5, 3, rIndex, iIndex, nSteps);
h2t(data1->NbTY, data1->TY, &data2->NbTY, data2->TY, 5, 9, rIndex, iIndex, nSteps);
for(int ent = 0; ent < data1->getNumEntities(0); ent++){
for(int ele = 0; ele < data1->getNumElements(0, ent); ele++){
if(data1->skipElement(0, ent, ele)) continue;
int numNodes = data1->getNumNodes(0, ent, ele);
int numEdges = data1->getNumEdges(0, ent, ele);
int numComp = data1->getNumComponents(0, ent, ele);
std::vector<double> *out = incrementList(data2, numComp, numEdges);
std::vector<double> x(numNodes), y(numNodes), z(numNodes);
std::vector<double> vr(numNodes * numComp), vi(numNodes * numComp);
for(int nod = 0; nod < numNodes; nod++){
data1->getNode(0, ent, ele, nod, x[nod], y[nod], z[nod]);
for(int comp = 0; comp < numComp; comp++){
data1->getValue(rIndex, ent, ele, nod, comp, vr[numComp * nod + comp]);
data1->getValue(iIndex, ent, ele, nod, comp, vi[numComp * nod + comp]);
}
}
for(int nod = 0; nod < numNodes; nod++) out->push_back(x[nod]);
for(int nod = 0; nod < numNodes; nod++) out->push_back(y[nod]);
for(int nod = 0; nod < numNodes; nod++) out->push_back(z[nod]);
for(int t = 0; t < nSteps; t++) {
double p = 2. * M_PI * t / nSteps;
for(int nod = 0; nod < numNodes; nod++) {
for(int comp = 0; comp < numComp; comp++) {
double val = vr[numComp * nod + comp] * cos(p) -
vi[numComp * nod + comp] * sin(p);
out->push_back(val);
}
}
}
}
}
for(int i = 0; i < nSteps; i++){
double p = 2. * M_PI * i / (double)nSteps;
......
......@@ -16,7 +16,7 @@ extern "C"
class GMSH_HarmonicToTimePlugin : public GMSH_PostPlugin
{
public:
GMSH_HarmonicToTimePlugin();
GMSH_HarmonicToTimePlugin(){}
void getName(char *name) const;
void getInfos(char *author, char *copyright, char *help_text) const;
void catchErrorMessage(char *errorMessage) const;
......
......@@ -19,17 +19,14 @@ PView *GMSH_PostPlugin::getView(int index, PView *view)
}
}
PViewDataList *GMSH_PostPlugin::getDataList(PView *view)
PViewDataList *GMSH_PostPlugin::getDataList(PView *view, bool error)
{
if(!view) return 0;
PViewDataList *data = dynamic_cast<PViewDataList*>(view->getData());
if(data){
if(data)
return data;
}
else{
// FIXME: do automatic data conversion here
else if(error)
Msg::Error("This plugin can only be run on list-based views (`.pos' files)");
return 0;
}
}
......@@ -81,7 +81,7 @@ class GMSH_PostPlugin : public GMSH_Plugin
// get the view given an index and a default value
virtual PView *getView(int index, PView *view);
// get the data in list format
virtual PViewDataList *getDataList(PView *view);
virtual PViewDataList *getDataList(PView *view, bool error=1);
virtual void assignSpecificVisibility() const {}
virtual bool geometricalFilter(gmshMatrix<double> *) const { return true; }
};
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment