Logo Search packages:      
Sourcecode: felt version File versions  Download package

apply.c

/*
    This file is part of the FElt finite element analysis package.
    Copyright (C) 1993-2000 Jason I. Gobat and Darren C. Atkinson

    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., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

/************************************************************************
 * File:    apply.c                                         *
 *                                                    *
 * Description:   This files contains the functions concerning the      *
 *          application of objects to other objects.        *
 ************************************************************************/

# include <stdio.h>
# include <X11/Intrinsic.h>
# include "Element.h"
# include "Node.h"
# include "Force.h"
# include "Load.h"
# include "Constraint.h"
# include "Material.h"
# include "problem.h"
# include "globals.h"
# include "Drawing.h"
# include "text_entry.h"
# include "error.h"
# include "vfe.h"
# include "procedures.h"

extern LoadDialog load_d;
extern ConstraintDialog constraint_d;
extern ForceDialog      force_d;
extern MaterialDialog   material_d;
extern ElementDialog    element_d;
extern NodeDialog node_d;

      /*
       * applying forces
       */

void ApplyForceGroup (figures, nfigures)
    Figure  *figures;
    unsigned nfigures;
{
    unsigned            i;
    Figure        fig;
    FigureAttributes    attr;
    Node          node;
    Drawn         drawn;
    Node          displayed;


    displayed = NodeDialogActive (node_d);

    for (i = 0; i < nfigures; i ++) {
      fig = figures [i];
      DW_GetAttributes (drawing, fig, &attr);

      if (attr.user_data == NULL || attr.type == TextFigure)
          continue;

      node = (Node) attr.user_data;
      drawn = (Drawn) node -> aux;
      if (drawn -> type != DrawnNode)
          continue;

      node -> force = ForceDialogActive (force_d);
      changeflag = True;

      if (node == displayed)
          NodeDialogDisplay (node_d, node);
    }

    XtFree ((char *) figures);
}


void DoApplyForce (node)
    Node node;
{
    static char message [40];


    node -> force = ForceDialogActive (force_d);

    NodeDialogDisplay (node_d, node);

    sprintf (message, "Applied to node %d.  Select node:", node -> number);
    ChangeStatusLine (message, True);
    changeflag = True;
}

void ApplyForceCB (w, client_data, call_data)
    Widget    w;
    XtPointer client_data;
    XtPointer call_data;
{
    DrawingReport   *report;
    FigureAttributes attributes;
    Figure           figure;
    Node             node;
    Drawn            drawn;


    report = (DrawingReport *) call_data;

    if (report -> event -> type != ButtonPress)
      return;

    if (report -> event -> xbutton.button == 3)
      QuitEdit ( );

    if (report -> event -> xbutton.button == 2)
      SelectGroup (call_data, ApplyForceGroup);

    if (report -> event -> xbutton.button != 1)
      return;

    figure = DW_FindFigure (w, report -> unsnapped.x, report -> unsnapped.y);

    if (figure == NULL)
      return;

    DW_GetAttributes (w, figure, &attributes);
    if (attributes.user_data == NULL)
      return;

    node = (Node) attributes.user_data;
    drawn = (Drawn) node -> aux;
    if (drawn -> type != DrawnNode)
      return;

    DoApplyForce (node);
}


void ApplyForceAP ( )
{
    char       *status;
    struct node dummy;
    Item        found;


    if ((status = GetTextNumber (&dummy.number)) != NULL) {
      if (!strcmp (status, "w"))
          SelectGroup (NULL, ApplyForceGroup);
      return;
    }

    found = TreeSearch (problem.node_tree, (Item) &dummy);
    if (found == NULL) {
      error ("Node %d does not exist.", dummy.number);
      return;
    }

    DoApplyForce (found);
}


void EditApplyForce ( )
{
    if (ForceDialogActive (force_d) == NULL) {
      error ("No active force defined.");
      return;
    }

    SetEditMode ( );
    ChangeStatusLine ("Select node:", True);

    XtRemoveAllCallbacks (drawing, XtNbuttonCallback);
    XtAddCallback (drawing, XtNbuttonCallback, ApplyForceCB, NULL);

    XtOverrideTranslations (entry,
      XtParseTranslationTable ("<Key>Return: ApplyForceAP()"));
}

      /*
       * applying constraints
       */

void ApplyConstraintGroup (figures, nfigures)
    Figure  *figures;
    unsigned nfigures;
{
    unsigned            i;
    Figure        fig;
    FigureAttributes    attr;
    Node          node;
    Drawn         drawn;
    Node          displayed;


    displayed = NodeDialogActive (node_d);

    for (i = 0; i < nfigures; i ++) {
      fig = figures [i];
      DW_GetAttributes (drawing, fig, &attr);

      if (attr.user_data == NULL || attr.type == TextFigure)
          continue;

      node = (Node) attr.user_data;
      drawn = (Drawn) node -> aux;
      if (drawn -> type != DrawnNode)
          continue;

      node -> constraint = ConstraintDialogActive (constraint_d);
      changeflag = True;

      if (node == displayed)
          NodeDialogDisplay (node_d, node);
    }

    XtFree ((char *) figures);
}


void DoApplyConstraint (node)
    Node node;
{
    static char message [40];


    node -> constraint = ConstraintDialogActive (constraint_d);

    NodeDialogDisplay (node_d, node);

    sprintf (message, "Applied to node %d.  Select node:", node -> number);
    ChangeStatusLine (message, True);
    changeflag = True;
}


void ApplyConstraintCB (w, client_data, call_data)
    Widget    w;
    XtPointer client_data;
    XtPointer call_data;
{
    DrawingReport   *report;
    FigureAttributes attributes;
    Figure           figure;
    Drawn        drawn;
    Node             node;


    report = (DrawingReport *) call_data;

    if (report -> event -> type != ButtonPress)
      return;

    if (report -> event -> xbutton.button == 3)
      QuitEdit ( );

    if (report -> event -> xbutton.button == 2)
      SelectGroup (call_data, ApplyConstraintGroup);

    if (report -> event -> xbutton.button != 1)
      return;

    figure = DW_FindFigure (w, report -> unsnapped.x, report -> unsnapped.y);

    if (figure == NULL)
      return;

    DW_GetAttributes (w, figure, &attributes);
    if (attributes.user_data == NULL)
      return;

    node = (Node) attributes.user_data;
    drawn = (Drawn) node -> aux;
    if (drawn -> type != DrawnNode)
      return;

    DoApplyConstraint (node);
}


void ApplyConstraintAP ( )
{
    char       *status;
    struct node dummy;
    Item        found;


    if ((status = GetTextNumber (&dummy.number)) != NULL) {
      if (!strcmp (status, "w"))
          SelectGroup (NULL, ApplyConstraintGroup);
      return;
    }

    found = TreeSearch (problem.node_tree, (Item) &dummy);
    if (found == NULL) {
      error ("Node %d does not exist.", dummy.number);
      return;
    }

    DoApplyConstraint (found);
}


void EditApplyConstraint ( )
{

    if (ConstraintDialogActive (constraint_d) == NULL) {
      error ("No active constraint defined.");
      return;
    }

    SetEditMode ( );
    ChangeStatusLine ("Select node:", True);

    XtRemoveAllCallbacks (drawing, XtNbuttonCallback);
    XtAddCallback (drawing, XtNbuttonCallback, ApplyConstraintCB, NULL);

    XtOverrideTranslations (entry,
      XtParseTranslationTable ("<Key>Return: ApplyConstraintAP()"));
}

      /*
       * applying loads
       */

void ApplyLoadGroup (figures, nfigures)
    Figure  *figures;
    unsigned nfigures;
{
    unsigned            i;
    Figure        fig;
    FigureAttributes    attr;
    Element       element;
    Drawn         drawn;
    Element       displayed;


    displayed = ElementDialogActive (element_d);

    for (i = 0; i < nfigures; i ++) {
      fig = figures [i];
      DW_GetAttributes (drawing, fig, &attr);

      if (attr.user_data == NULL || attr.type == TextFigure)
          continue;

      element = (Element) attr.user_data;
      drawn = (Drawn) element -> aux;
      if (drawn -> type != DrawnElement)
          continue;

      if (element -> numdistributed == 3)
          return;

      element->distributed [++ element->numdistributed] =
                                    LoadDialogActive (load_d);

      changeflag = True;

      if (element == displayed)
          ElementDialogDisplay (element_d, element);
    }

    XtFree ((char *) figures);
}




void DoApplyLoad (element)
    Element element;
{
    static char message [80];


    if (element -> numdistributed == 3) {
      error ("Maximum number of loads applied.");
      return;
    }

    element->distributed[++ element->numdistributed] = LoadDialogActive(load_d);

    ElementDialogDisplay (element_d, element);

    sprintf (message, "Applied to element %d.  Select element:", element -> number);
    ChangeStatusLine (message, True);
    changeflag = True;
}


void ApplyLoadCB (w, client_data, call_data)
    Widget    w;
    XtPointer client_data;
    XtPointer call_data;
{
    DrawingReport   *report;
    FigureAttributes attributes;
    Figure           figure;
    Drawn            drawn;
    Element          element;


    report = (DrawingReport *) call_data;

    if (report -> event -> type != ButtonPress)
      return;

    if (report -> event -> xbutton.button == 3)
      QuitEdit ( );

    if (report -> event -> xbutton.button == 2)
      SelectGroup (call_data, ApplyLoadGroup);

    if (report -> event -> xbutton.button != 1)
      return;

    figure = DW_FindFigure (w, report -> unsnapped.x, report -> unsnapped.y);

    if (figure == NULL)
      return;

    DW_GetAttributes (w, figure, &attributes);
    if (attributes.user_data == NULL)
      return;

    element = (Element) attributes.user_data;
    drawn = (Drawn) element -> aux;
    if (drawn -> type != DrawnElement)
      return;

    DoApplyLoad (element);
}


void ApplyLoadAP ( )
{
    char          *status;
    struct element dummy;
    Item           found;


    if ((status = GetTextNumber (&dummy.number)) != NULL) {
      if (!strcmp (status, "w"))
          SelectGroup (NULL, ApplyLoadGroup);
      return;
    }

    found = TreeSearch (problem.element_tree, (Item) &dummy);
    if (found == NULL) {
      error ("Element %d does not exist.", dummy.number);
      return;
    }

    DoApplyLoad (found);
}


void EditApplyLoad ( )
{
    if (LoadDialogActive (load_d) == NULL) {
      error ("No active load defined.");
      return;
    }

    SetEditMode ( );
    ChangeStatusLine ("Select element:", True);

    XtRemoveAllCallbacks (drawing, XtNbuttonCallback);
    XtAddCallback (drawing, XtNbuttonCallback, ApplyLoadCB, NULL);

    XtOverrideTranslations (entry,
      XtParseTranslationTable ("<Key>Return: ApplyLoadAP()"));
}

      /*
       * applying materials
       */

void ApplyMaterialGroup (figures, nfigures)
    Figure  *figures;
    unsigned nfigures;
{
    unsigned            i;
    Figure        fig;
    FigureAttributes    attr;
    Element       element;
    Drawn         drawn;
    Element       displayed;


    displayed = ElementDialogActive (element_d);

    for (i = 0; i < nfigures; i ++) {
      fig = figures [i];
      DW_GetAttributes (drawing, fig, &attr);

      if (attr.user_data == NULL || attr.type == TextFigure)
          continue;

      element = (Element) attr.user_data;
      drawn = (Drawn) element -> aux;
      if (drawn -> type != DrawnElement)
          continue;

      element -> material = MaterialDialogActive (material_d);
      changeflag = True;

      if (element == displayed)
          ElementDialogDisplay (element_d, element);
    }

    XtFree ((char *) figures);
}


void DoApplyMaterial (element)
    Element element;
{
    static char message [80];


    element -> material = MaterialDialogActive (material_d);

    ElementDialogDisplay (element_d, element);

    sprintf (message, "Applied to element %d.  Select element:", element -> number);
    ChangeStatusLine (message, True);
    changeflag = True;
}


void ApplyMaterialCB (w, client_data, call_data)
    Widget    w;
    XtPointer client_data;
    XtPointer call_data;
{
    DrawingReport   *report;
    FigureAttributes attributes;
    Figure           figure;
    Drawn            drawn;
    Element          element;


    report = (DrawingReport *) call_data;

    if (report -> event -> type != ButtonPress)
      return;

    if (report -> event -> xbutton.button == 3)
      QuitEdit ( );

    if (report -> event -> xbutton.button == 2)
      SelectGroup (call_data, ApplyMaterialGroup);

    if (report -> event -> xbutton.button != 1)
      return;

    figure = DW_FindFigure (w, report -> unsnapped.x, report -> unsnapped.y);

    if (figure == NULL)
      return;

    DW_GetAttributes (w, figure, &attributes);
    if (attributes.user_data == NULL)
      return;

    element = (Element) attributes.user_data;
    drawn = (Drawn) element -> aux;
    if (drawn -> type != DrawnElement)
      return;

    DoApplyMaterial (element);
}


void ApplyMaterialAP ( )
{
    char          *status;
    struct element dummy;
    Item           found;


    if ((status = GetTextNumber (&dummy.number)) != NULL) {
      if (!strcmp (status, "w"))
          SelectGroup (NULL, ApplyMaterialGroup);
      return;
    }

    found = TreeSearch (problem.element_tree, (Item) &dummy);
    if (found == NULL) {
      error ("Element %d does not exist.", dummy.number);
      return;
    }

    DoApplyMaterial (found);
}


void EditApplyMaterial ( )
{
    if (MaterialDialogActive (material_d) == NULL) {
      error ("No active material defined.");
      return;
    }

    SetEditMode ( );
    ChangeStatusLine ("Select element:", True);

    XtRemoveAllCallbacks (drawing, XtNbuttonCallback);
    XtAddCallback (drawing, XtNbuttonCallback, ApplyMaterialCB, NULL);

    XtOverrideTranslations (entry,
      XtParseTranslationTable ("<Key>Return: ApplyMaterialAP()"));
}

Generated by  Doxygen 1.6.0   Back to index