Exemple #1
0
void PolyMolecule::computeNormals()
{
  m_FaceNormals.fill(vec3_t(0,0,0), m_Faces.size());
  m_NodeNormals.fill(vec3_t(0,0,0), m_Nodes.size());
  for (int i = 0; i < m_Faces.size(); ++i) {
    QVector<vec3_t> x(m_Faces[i].size() + 1);
    vec3_t x_face(0,0,0);
    for (int j = 0; j < m_Faces[i].size(); ++j) {
      x[j] = getXNode(m_Faces[i][j]);
      x_face += x[j];
    }
    x.last() = x.first();
    x_face *= 1.0/m_Faces[i].size();
    m_FaceNormals[i] = vec3_t(0,0,0);
    for (int j = 0; j < m_Faces[i].size(); ++j) {
      m_FaceNormals[i] += triNormal(x_face, x[j], x[j+1]);
    }
    for (int j = 0; j < m_Faces[i].size(); ++j) {
      vec3_t n = m_FaceNormals[i];
      //n.normalise();
      m_NodeNormals[m_Faces[i][j]] += n;
    }
  }
  for (int i = 0; i < m_Nodes.size(); ++i) {
    m_NodeNormals[i].normalise();
  }
}
Exemple #2
0
void PolyMolecule::createPolyData(vtkPolyData *poly_data)
{
  int N = m_Nodes.size();
  EG_VTKSP(vtkPoints, points);
  points->SetNumberOfPoints(N);
  for (int i = 0; i < N; ++i) {
    vec3_t x = getXNode(i);
    points->SetPoint(i, x.data());
  }
  poly_data->Allocate(m_Faces.size());
  poly_data->SetPoints(points);
  for (int i = 0; i < m_Faces.size(); ++i) {
    QVector<vtkIdType> pts(m_Faces[i].size());
    for (int j = 0; j < m_Faces[i].size(); ++j) {
      pts[j] = m_Faces[i][j];
    }
    if (pts.size() == 3) {
      poly_data->InsertNextCell(VTK_TRIANGLE, pts.size(), pts.data());
    } else if (pts.size() == 4) {
      poly_data->InsertNextCell(VTK_QUAD, pts.size(), pts.data());
    } else {
      poly_data->InsertNextCell(VTK_POLYGON, pts.size(), pts.data());
    }
  }
}
Exemple #3
0
void PolyMolecule::computeCentreOfGravity()
{
  m_AllPositive = true;
  // first guess of centre of gravity
  vec3_t x_centre(0,0,0);
  for (int i = 0; i < m_Faces.size(); ++i) {
    x_centre += getXFace(i);
  }
  m_N2BadFaces.resize(m_Nodes.size());
  for (int i = 0; i < m_Nodes.size(); ++i) {
    m_N2BadFaces[i].clear();
  }
  x_centre *= 1.0/m_Faces.size();
  for (int iter = 0; iter < 2; ++iter) {
    double V_total = 0;
    m_CentreOfGravity = vec3_t(0,0,0);
    m_MaxPyramidVolume = -1e99;
    m_MinPyramidVolume =  1e99;
    for (int i = 0; i < m_Faces.size(); ++i) {
      double V_pyramid = 0;
      vec3_t x_face = getXFace(i);
      QVector<vec3_t> x(m_Faces[i].size() + 1);
      for (int j = 0; j < m_Faces[i].size(); ++j) {
        x[j] = getXNode(m_Faces[i][j]);
      }
      x.last() = x.first();      
      for (int j = 0; j < m_Faces[i].size(); ++j) {
        double V = GeometryTools::tetraVol(x_face, x[j+1], x[j], x_centre, true);
        if (V <= 0) {
          m_AllPositive = false;
        }
        V_total += V;
        V_pyramid += V;
        m_CentreOfGravity += 0.25*V*(x_face + x[j+1] + x[j] + x_centre);
      }
      if (V_pyramid <= 0) {
        for (int j = 0; j < m_Faces[i].size(); ++j) {
          m_N2BadFaces[m_Faces[i][j]].insert(i);
        }
      }
      m_MaxPyramidVolume = max(V_pyramid, m_MaxPyramidVolume);
      m_MinPyramidVolume = min(V_pyramid, m_MinPyramidVolume);
    }
    m_CentreOfGravity *= 1.0/V_total;
    x_centre = m_CentreOfGravity;
  }
}
Exemple #4
0
void PolyMolecule::writeVtkFile(QString file_name)
{
  EG_VTKSP(vtkUnstructuredGrid, grid);
  allocateGrid(grid, m_Faces.size(), m_Nodes.size());

  EG_VTKSP(vtkDoubleArray, normals);
  normals->SetNumberOfComponents(3);
  normals->SetNumberOfTuples(m_Nodes.size());
  normals->SetName("N");

  EG_VTKSP(vtkDoubleArray, badness);
  badness->SetNumberOfComponents(1);
  badness->SetNumberOfTuples(m_Nodes.size());
  badness->SetName("badness");

  for (int i = 0; i < m_Nodes.size(); ++i) {
    vec3_t x = getXNode(i);
    grid->GetPoints()->SetPoint(i, x.data());
    normals->SetTuple(i, m_NodeNormals[i].data());
    badness->SetValue(i, double(m_N2BadFaces[i].size()));
  }
  grid->GetPointData()->AddArray(normals);
  grid->GetPointData()->AddArray(badness);

  for (int i = 0; i < m_Faces.size(); ++i) {
    QVector<vtkIdType> pts(m_Faces[i].size());
    for (int j = 0; j < m_Faces[i].size(); ++j) {
      pts[j] = m_Faces[i][j];
    }
    grid->InsertNextCell(VTK_POLYGON, m_Faces[i].size(), pts.data());
  }
  EG_VTKSP(vtkXMLUnstructuredGridWriter, vtu);
  file_name = GuiMainWindow::pointer()->getCwd() + "/" + file_name + ".vtu";
  vtu->SetFileName(qPrintable(file_name));
  vtu->SetDataModeToBinary();
  vtu->SetInputData(grid);
  vtu->Write();
}
Exemple #5
0
gboolean loadConfig(const gchar *filename, CfgFile *lcfg) {
    /* Parse hosts.xml document. */
    xmlDocPtr xcfg = xmlParseFile(filename);
    if(xcfg == NULL)
      return(FALSE);

    /* Handle Xincludes. */
    xmlSetGenericErrorFunc(NULL, xmlErrIgnoreHandler);
    xmlXIncludeProcess(xcfg);
    handleXMLError( xmlGetLastError() );
    xmlSetGenericErrorFunc(NULL, NULL);

    /* Validate against DTD. */
    xmlValidCtxtPtr xval = xmlNewValidCtxt();
    if(xmlValidateDocument(xval, xcfg) == 0) {
      xmlFreeValidCtxt(xval);
      return(FALSE);
    }
    xmlFreeValidCtxt(xval);

    /* Allocate XPath context. */
    xmlXPathContextPtr xctx = xmlXPathNewContext(xcfg);
    if(!xctx) {
      g_error("%s: xmlXPathNewContext failed!\n", filename);
      return(FALSE);
    }

    xmlNodePtr s_ssh[2] = {getXNode(xctx, "/apt-dater/ssh"), NULL};
    xmlNodePtr s_path[2] = {getXNode(xctx, "/apt-dater/paths"), NULL};
#ifdef FEAT_TMUX
    xmlNodePtr s_tmux[2] = {getXNode(xctx, "/apt-dater/tmux"), NULL};
#else
    xmlNodePtr s_screen[2] = {getXNode(xctx, "/apt-dater/screen"), NULL};
#endif
    xmlNodePtr s_appearance[2] = {getXNode(xctx, "/apt-dater/appearance"), NULL};
    xmlNodePtr s_notify[2] = {getXNode(xctx, "/apt-dater/notify"), NULL};
    xmlNodePtr s_hooks[2] = {getXNode(xctx, "/apt-dater/hooks"), NULL};
#ifdef FEAT_AUTOREF
    xmlNodePtr s_autoref[2] = {getXNode(xctx, "/apt-dater/auto-ref"), NULL};
#endif
#ifdef FEAT_HISTORY
    xmlNodePtr s_history[2] = {getXNode(xctx, "/apt-dater/history"), NULL};
#endif
#ifdef FEAT_TCLFILTER
    xmlNodePtr s_tclfilter[2] = {getXNode(xctx, "/apt-dater/tcl-filter"), NULL};
#endif

    lcfg->ssh_optflags = getXPropStr(s_ssh, "opt-cmd-flags", "-t");
    lcfg->ssh_cmd = getXPropStr(s_ssh, "cmd", "/usr/bin/ssh");
    lcfg->sftp_cmd = getXPropStr(s_ssh, "sftp-cmd", "/usr/bin/sftp");

    lcfg->umask = getXPropInt(s_path, "umask", S_IRWXG | S_IRWXO);
    umask(lcfg->umask);

    lcfg->hostsfile = getXPropStr(s_path, "hosts-file", g_strdup_printf("%s/%s/%s", g_get_user_config_dir(), PROG_NAME, "hosts.xml"));
    lcfg->statsdir = getXPropStr(s_path, "stats-dir", g_strdup_printf("%s/%s/%s", g_get_user_cache_dir(), PROG_NAME, "stats"));
    if(g_mkdir_with_parents(lcfg->statsdir, S_IRWXU | S_IRWXG) == -1) {
      g_warning("Failed to create %s: %s", lcfg->statsdir, g_strerror(errno));
      exit(1);
    }

#ifdef FEAT_TMUX
    lcfg->tmuxconffile = getXPropStr(s_tmux, "conf-file", g_strdup_printf("%s/%s/%s", g_get_user_config_dir(), PROG_NAME, "tmux.conf"));
    lcfg->tmuxsockpath = getXPropStr(s_tmux, "socket-path", g_strdup_printf("%s/%s/%s", g_get_user_cache_dir(), PROG_NAME, "tmux"));
    if(g_mkdir_with_parents(lcfg->tmuxsockpath, S_IRWXU | S_IRWXG) == -1) {
      g_warning("Failed to create %s: %s", lcfg->tmuxsockpath, g_strerror(errno));
      exit(1);
    }
#else
    lcfg->screenrcfile = getXPropStr(s_screen, "rc-file", g_strdup_printf("%s/%s/%s", g_get_user_config_dir(), PROG_NAME, "screenrc"));
    lcfg->screentitle = getXPropStr(s_screen, "title", g_strdup("%m # %U%H"));
#endif

    lcfg->ssh_agent = getXPropBool(s_ssh, "spawn-agent", FALSE);

    xmlNodeSetPtr s_addkeys = getXNodes(xctx, "/apt-dater/ssh/add-key");
    if(!xmlXPathNodeSetIsEmpty(s_addkeys)) {
      lcfg->ssh_add = g_new0(char*, s_addkeys->nodeNr + 1);
      int i;
      for(i = 0; i < s_addkeys->nodeNr; i++) {
	lcfg->ssh_add[i] = g_strdup((gchar *)xmlGetProp(s_addkeys->nodeTab[i], BAD_CAST("name")));
	xmlChar *c = xmlGetProp(s_addkeys->nodeTab[i], BAD_CAST("fn"));
	if(!c) {
	    g_printerr(_("Empty SSH key filename (%s/@fn) in configuration."), xmlGetNodePath(s_addkeys->nodeTab[i]));
	    exit(1);
	}
	lcfg->ssh_add[i] = g_strdup((gchar *)c);
      }
      lcfg->ssh_numadd = s_addkeys->nodeNr;
    }
Exemple #6
0
vec3_t PolyMolecule::getXFace(int face)
{
  vec3_t x(0,0,0);
  foreach (int i, m_Faces[face]) {
    x += getXNode(i);
  }