Download this file

450 lines (389 with data), 14.9 kB

/// This folder contains the environment, i.e. the chair
AnyFolder EnvironmentModel = {
  
  /// The global reference frame, i.e. ground.
  AnyFixedRefFrame GlobalRef = {
    
    AnyFolder &Dim = .Seg.ChairDimensions;
    
    AnyRefNode GroundNode = {
      sRel = {1/2*.Dim.SeatLength, -.Dim.BackRestHeight, 0};
    };
  };  // Global reference frame
  
  //-----------------------------------------------------
  // Segments
  //-----------------------------------------------------  
  AnyFolder Seg = {
    
    AnyFolder ChairDimensions = {
      AnyVar FootRestLength = 0.25;
      AnyVar FootRestWidth = 0.40;
      AnyVar FootRestThickness = 0.05;
      AnyVar BackRestHeight = 0.90;
      AnyVar BackRestWidth = 0.40;
      AnyVar BackRestThickness = 0.05;
      AnyVar SeatLength = 0.50;
      AnyVar SeatWidth = 0.40;
      AnyVar SeatThickness = 0.05;
      AnyVar HeadRestHeight = 0.2;
      AnyVar HeadRestWidth = 0.2;
      AnyVar HeadRestThickness = 0.05;
      AnyVar LegRestLength = 0.6;
      AnyVar LegRestWidth = 0.3;
      AnyVar LegRestThickness = 0.05;
      AnyVar ArmRestX = 0.30;
      AnyVar ArmRestY = 0.3;
      AnyVar ArmRestZ = 0.05;      
      AnyVar ArmRestHeight = 0.32;    
    }; // ChairDimensions  
    
    //--------------------------------------------------------
    // BackRest
    //--------------------------------------------------------
    AnySeg BackRest = {
      
      AnyFolder &Dim = .ChairDimensions;
      Mass = 0.0;
      AnyVar Ixx = 1/12*(Dim.BackRestHeight^2+Dim.BackRestWidth^2);
      AnyVar Iyy = 1/12*(Dim.BackRestThickness^2+Dim.BackRestWidth^2);
      AnyVar Izz = 1/12*(Dim.BackRestHeight^2+Dim.BackRestThickness^2);
      Jii = {Ixx, Iyy, Izz};
      
      AnyRefNode BackRestSeatJntNode = {
        sRel = {0, -1/2*.Dim.BackRestHeight, 0};
      };
      
      AnyRefNode BackRestHeadRestJntNode = {
        sRel = {0, 1/2*.Dim.BackRestHeight, 0};
      };
      AnyRefNode BackRestSupportNode = {
        sRel = {-0.2, -0.2, 0};
      };
      
      AnyRefNode BackArmRestRightJntNode = {
        sRel = {0, .Dim.ArmRestHeight-1/2*.Dim.BackRestHeight, 1/2*.Dim.BackRestWidth};
      };
      
      AnyRefNode BackArmRestLeftJntNode = {
        sRel = {0, .Dim.ArmRestHeight-1/2*.Dim.BackRestHeight, -1/2*.Dim.BackRestWidth};
      };
      
      AnyDrawSTL BackRest = {
        FileName = "BackRest.stl";
        RGB = {0, 0, 1};
        Opacity = 0.2;
        AnyStyleDrawMaterial1 style = 
        {
          EnableCreasing = On;
          CreasingAngle = 0.524;
          SpecularRGB = 0.05*{1,1,1};
        };
      };
    }; // BackRest        
    
    //--------------------------------------------------------
    // Seat
    //--------------------------------------------------------
    AnySeg Seat = {
      AnyFolder &Dim = .ChairDimensions;
      Mass = 0.0;
      AnyVar Ixx = 1/12*(Dim.SeatWidth^2+Dim.SeatThickness^2);
      AnyVar Iyy = 1/12*(Dim.SeatLength^2+Dim.SeatWidth^2);
      AnyVar Izz = 1/12*(Dim.SeatLength^2+Dim.SeatThickness^2);
      Jii = {Ixx, Iyy, Izz};
      AnyRefNode SeatNode = {
        sRel = {0, 0, 0};
        ARel = {{0, 1, 0}, {-1, 0, 0}, {0, 0, 1}};
        
        AnyDrawSTL Seat = {
          FileName = "Seat.stl";
          RGB = {0, 0, 1};
          Opacity = 0.2;
          AnyStyleDrawMaterial1 style = 
          {
            EnableCreasing = On;
            CreasingAngle = 0.524;
            SpecularRGB = 0.05*{1,1,1};
          };
        };
      };
      
      AnyRefNode SeatBackRestJntNode = {
        sRel = {0, 1/2*.Dim.SeatLength, 0};
      };
      
      AnyRefNode SeatAdjNode = {
        sRel = {0, 0, 0};
      };
      
      AnyRefNode SeatLegRestJntNode = {
        sRel = {0, -1/2*.Dim.SeatLength, 0};
      };    
    }; // Seat 
    
    //-----------------------------------------------------
    // HeadRest
    //-----------------------------------------------------
    AnySeg HeadRest = {
      AnyFolder &Dim = .ChairDimensions;
      Mass = 0.0;
      AnyVar Ixx = 1/12*(Dim.HeadRestHeight^2+Dim.HeadRestWidth^2);
      AnyVar Iyy = 1/12*(Dim.HeadRestWidth^2+Dim.HeadRestThickness^2);
      AnyVar Izz = 1/12*(Dim.HeadRestHeight^2+Dim.HeadRestThickness^2);
      Jii = {Ixx, Iyy, Izz};
      
      AnyRefNode HeadRestBackRestJntNode = {
        sRel = {0, -1/2*.Dim.HeadRestHeight, 0};
        // AnyDrawNode DrwNode = {};
      };
      
      // AnyDrawSeg HeadRest = {};
      AnyDrawSTL HeadRest = {
        FileName = "HeadRest.stl";
        RGB = {0, 0, 1};
        Opacity = 0.4;
        AnyStyleDrawMaterial1 style = 
        {
          EnableCreasing = On;
          CreasingAngle = 0.524;
          SpecularRGB = 0.05*{1,1,1};
        };
      };
    }; // HeadRest
    
    //-------------------------------------------------------
    // LegRest
    //-------------------------------------------------------
    AnySeg LegRest = {
      AnyFolder &Dim = .ChairDimensions;
      Mass = 0.0;
      AnyVar Ixx = 1/12*(Dim.LegRestLength^2+Dim.LegRestWidth^2);
      AnyVar Iyy = 1/12*(Dim.LegRestWidth^2+Dim.LegRestThickness^2);
      AnyVar Izz = 1/12*(Dim.LegRestLength^2+Dim.LegRestThickness^2);
      Jii = {Ixx, Iyy, Izz};
      
      AnyRefNode LegRestSeatJntNode = {
        sRel = {0, 1/2*.Dim.LegRestLength, 0};
      };
      
      AnyRefNode LegRestFootRestJntNode = {
        sRel = {0, -1/2*.Dim.LegRestLength, 0};
      };    
      
      AnyDrawSTL LegRest = {
        FileName = "LegRest.stl";       
        RGB = {0, 0, 1};
        Opacity = 0.2;
        AnyStyleDrawMaterial1 style = 
        {
          EnableCreasing = On;
          CreasingAngle = 0.524;
          SpecularRGB = 0.05*{1,1,1};
        };
      };
    }; // LegRest 
    
    //---------------------------------------------------
    // FootRest
    //---------------------------------------------------
    AnySeg FootRest = {
      AnyFolder &Dim = .ChairDimensions;
      Mass = 5.0;
      AnyVar Ixx = 1/12*(Dim.FootRestThickness^2+Dim.FootRestWidth^2);
      AnyVar Iyy = 1/12*(Dim.FootRestLength^2+Dim.FootRestWidth^2);
      AnyVar Izz = 1/12*(Dim.FootRestLength^2+Dim.FootRestThickness^2);
      Jii = {Ixx, Iyy, Izz};     
      
      AnyRefNode FootRestLegRestJntNode = {
        sRel = {0, 1/2*.Dim.FootRestLength, 0};
        ARel = {{0, 1, 0}, {-1, 0, 0}, {0, 0, 1}};
        /*
        AnyDrawRefFrame DrwRefFrame = {
        RGB = {1, 1, 0};
        ScaleXYZ = {0.3, 0.3, 0.3};
        };
        */
      };
      // AnyDrawSeg DrwSeg = {};
      
      AnyDrawSTL DrwSTL = {
        FileName = "FootRest2.stl";
        RGB = {0,0, 1};
        Opacity = 0.2;
        AnyStyleDrawMaterial1 style = 
        {
          EnableCreasing = On;
          CreasingAngle = 0.524;
          SpecularRGB = 0.05*{1,1,1};
        };
      };
      
    }; // FootRest    
    
    //---------------------------------------------------
    // ArmRestRight
    //---------------------------------------------------
    AnyFolder Right = {
      AnySeg ArmRest = {
        AnyFolder &Dim = ..ChairDimensions;
        Mass = 1.0;
        AnyVar Ixx = 1/12*(Dim.ArmRestZ^2+Dim.ArmRestX^2);
        AnyVar Iyy = 1/12*(Dim.ArmRestY^2+Dim.ArmRestX^2);
        AnyVar Izz = 1/12*(Dim.ArmRestY^2+Dim.ArmRestZ^2);
        Jii = {Ixx, Iyy, Izz};     
        
        AnyRefNode BackArmRestJntNode = {
          sRel = {0, .Dim.ArmRestX, -1/2*.Dim.ArmRestZ};       
        };
        
        AnyRefNode ArmRestUlnaJntNodeFront = {
          sRel = {0, -1/2*.Dim.ArmRestY, 0};//-1/2*.Dim.ArmRestZ};
        };
        
        AnyRefNode ArmRestUlnaJntNodeBack = {
          sRel = {0, 1/2*.Dim.ArmRestY, 0};//-1/2*.Dim.ArmRestZ};
        };
        
        AnyRefNode STLholder = {
          sRel = {-0.45, 0, 0};
          AnyDrawSTL DrwSTL = {
            FileName = "ArmRest3.stl";
            RGB = {0, 0, 1};
            Opacity = 0.2;
            AnyStyleDrawMaterial1 style = 
            {
              EnableCreasing = On;
              CreasingAngle = 0.524;
              SpecularRGB = 0.05*{1,1,1};
            };
          };
        };     
      }; // ArmRest    
    }; // Right
    
    AnyFolder Left = {
      AnySeg ArmRest = {
        AnyFolder &Dim = ..ChairDimensions;
        Mass = 1.0;
        AnyVar Ixx = 1/12*(Dim.ArmRestZ^2+Dim.ArmRestX^2);
        AnyVar Iyy = 1/12*(Dim.ArmRestY^2+Dim.ArmRestX^2);
        AnyVar Izz = 1/12*(Dim.ArmRestY^2+Dim.ArmRestZ^2);
        Jii = {Ixx, Iyy, Izz};     
        
        AnyRefNode BackArmRestJntNode = {
          sRel = {0, .Dim.ArmRestX, -1/2*.Dim.ArmRestZ};       
        };
        
        AnyRefNode ArmRestUlnaJntNodeFront = {
          sRel = {0, -1/2*.Dim.ArmRestY, 0};//-1/2*.Dim.ArmRestZ};
        };
        
        AnyRefNode ArmRestUlnaJntNodeBack = {
          sRel = {0, 1/2*.Dim.ArmRestY, 0};//-1/2*.Dim.ArmRestZ};
        };
        
        AnyRefNode STLholder = {
          sRel = {-0.45, 0, 0};
          AnyDrawSTL DrwSTL = {
            FileName = "ArmRest3.stl";
            RGB = {0, 0, 1};
            Opacity = 0.2;
            AnyStyleDrawMaterial1 style = 
            {
              EnableCreasing = On;
              CreasingAngle = 0.524;
              SpecularRGB = 0.05*{1,1,1};
            };
          };
        };     
      }; // ArmRest    
    }; // Left
  }; // Seg
  
  //--------------------------------------
  // Joints
  //--------------------------------------
  
  AnyFolder Jnt = {
    AnyKinLinear SeatGlobalLinMeasure = {
      AnyRefNode &SegNode = ..Seg.Seat.SeatAdjNode;
      AnyRefNode &GroundNode = ..GlobalRef.GroundNode;
    };        
    
    AnyKinRotational SeatGlobalRotMeasure = {
      AnyRefNode &SegNode = ..Seg.Seat.SeatAdjNode;
      AnyRefNode &GroundNode = ..GlobalRef.GroundNode;
      Type = RotVector;
    };        
    
    AnyKinEq SeatGlobalConst = {
      AnyKinLinear &LinMeasure = .SeatGlobalLinMeasure;
      AnyKinRotational &RotMeasure = .SeatGlobalRotMeasure;
      MeasureOrganizer = {0, 2, 3, 4};
    };        
    
    AnyRevoluteJoint SeatBackRestJnt = {
      Axis = z;
      AnyRefNode &Seatnode = ..Seg.Seat.SeatBackRestJntNode;  
      AnyRefNode &BackRestNode = ..Seg.BackRest.BackRestSeatJntNode;
    }; // SeatBackRestLink
    
    AnyRevoluteJoint BackRestHeadRestJnt = {
      Axis = z;
      AnyRefNode &BackRestNode = ..Seg.BackRest.BackRestHeadRestJntNode;
      AnyRefNode &HeadRestNode = ..Seg.HeadRest.HeadRestBackRestJntNode;
    }; // BackRestHeadRestLink
    
    AnyRevoluteJoint SeatLegRestJnt = {
      Axis = z; 
      AnyRefNode &LegRestNode = ..Seg.LegRest.LegRestSeatJntNode;
      AnyRefNode &SeatNode = ..Seg.Seat.SeatLegRestJntNode;
    }; // SeatLegRestLink
    
    AnyPrismaticJoint LegRestFootRestJnt = {
      Axis = y;
      Ref = 1;
      AnyRefNode &LegRestNode = ..Seg.LegRest.LegRestFootRestJntNode;
      AnyRefNode &FootRestNode = ..Seg.FootRest.FootRestLegRestJntNode;
    };  
    
    AnyFolder Right = {
      AnyRevoluteJoint BackArmRestJoint = {
        AnyRefNode &BackNode = ...Seg.BackRest.BackArmRestRightJntNode;
        AnyRefNode &ArmRestNode = ...Seg.Right.ArmRest.BackArmRestJntNode;
        Ref = 1;
      };        
      
      AnyKinRotational GlobalArmRestRotMeasure = {
        AnyRefFrame &Global = Main.Model.EnvironmentModel.GlobalRef;
        AnyRefNode &ArmRestNode = ...Seg.Right.ArmRest.BackArmRestJntNode;
        Type = RotVector;
      };        
      
      AnyKinEqSimpleDriver GlobalArmRestAngle = {
        AnyKinRotational &RotMeasure = .GlobalArmRestRotMeasure;
        MeasureOrganizer = {2};
        DriverPos = {90*pi/180};
        DriverVel = {0};
      };
      
    }; // Right
    
    AnyFolder Left = {
      AnyRevoluteJoint BackArmRestJoint = {
        AnyRefNode &BackNode = ...Seg.BackRest.BackArmRestLeftJntNode;
        AnyRefNode &ArmRestNode = ...Seg.Left.ArmRest.BackArmRestJntNode;
        Ref = 1;
      };        
      
      AnyKinRotational GlobalArmRestRotMeasure = {
        AnyRefFrame &Global = Main.Model.EnvironmentModel.GlobalRef;
        AnyRefNode &ArmRestNode = ...Seg.Left.ArmRest.BackArmRestJntNode;
        Type = RotVector;
      };        
      
      AnyKinEqSimpleDriver GlobalArmRestAngle = {
        AnyKinRotational &RotMeasure = .GlobalArmRestRotMeasure;
        MeasureOrganizer = {2};
        DriverPos = {90*pi/180};
        DriverVel = {0};
      };
    }; // Left    
    
  }; // Joints
  
  /// This folder contains drivers for the chair segments.
  AnyFolder Drivers = {
    AnyFolder &DrvPos = Main.DrvPos;
    AnyFolder &DrvVel = Main.DrvVel;
    
    //--------------------------------------------------------
    // Drivers - Chair adjustments
    //--------------------------------------------------------
    AnyKinEqSimpleDriver GlobalBackRestDrv = {
      AnyKinRotational rot = {
        AnyRefFrame &Back = Main.Model.EnvironmentModel.Seg.BackRest;
        Type = RotAxesAngles;
      };
      MeasureOrganizer = {0};
      DriverPos = {.DrvPos.GlobalBackRestRotZPos*pi/180};
      DriverVel = {.DrvVel.GlobalBackRestRotZVel*pi/180};
      Reaction.Type = {On};
    };  
    
    AnyKinEqSimpleDriver SeatGlobalDrv = {
      AnyKinLinear &LinMeasure = ..Jnt.SeatGlobalLinMeasure;
      AnyKinRotational &RotMeasure = ..Jnt.SeatGlobalRotMeasure;
      MeasureOrganizer = {1,5};
      DriverPos = {-.DrvPos.SeatGlobalLinYPos,(-90+.DrvPos.SeatGlobalZRot)*pi/180};
      DriverVel = {-.DrvVel.SeatGlobalLinYVel,.DrvVel.SeatGlobalZRotVel*pi/180};
      Reaction.Type = {On,On};
    };
    
    AnyKinEqSimpleDriver BackRestHeadRestDrv = {
      AnyRevoluteJoint &Jnt = ..Jnt.BackRestHeadRestJnt;
      DriverPos = {.DrvPos.BackRestHeadResRotZPos*pi/180};
      DriverVel = {0};
      Reaction.Type = {On};
    };  
    
    AnyKinEqSimpleDriver GlobalLegRestDrv = {
      AnyKinRotational rot = {
        AnyRefFrame &LegRest = Main.Model.EnvironmentModel.Seg.LegRest;
        Type = RotAxesAngles;
      };
      MeasureOrganizer = {0};
      DriverPos = {.DrvPos.GlobalLegRestRotZPos*pi/180};
      DriverVel = {.DrvVel.GlobalLegRestRotZVel*pi/180};
      Reaction.Type = {On};
    };
    
    AnyKinEqSimpleDriver LegRestFootRestDrv = {
      AnyPrismaticJoint &Jnt = ..Jnt.LegRestFootRestJnt;
      DriverPos = {.DrvPos.LegRestFootRestLinYPos};
      DriverVel = {.DrvVel.LegRestFootRestLinYVel};
      Reaction.Type = {On};
    };
  };
};