00001 /*************************************************************************** 00002 *cr 00003 *cr (C) Copyright 1995-2019 The Board of Trustees of the 00004 *cr University of Illinois 00005 *cr All Rights Reserved 00006 *cr 00007 ***************************************************************************/ 00008 00009 /*************************************************************************** 00010 * RCS INFORMATION: 00011 * 00012 * $RCSfile: P_TugTool.C,v $ 00013 * $Author: johns $ $Locker: $ $State: Exp $ 00014 * $Revision: 1.54 $ $Date: 2019年01月17日 21:21:01 $ 00015 * 00016 *************************************************************************** 00017 * DESCRIPTION: 00018 * This is Paul's new Tracker code -- pgrayson@ks.uiuc.edu 00019 * 00020 * 00021 ***************************************************************************/ 00022 00023 #include "P_TugTool.h" 00024 #include "utilities.h" 00025 #include "Displayable.h" 00026 00027 TugTool::TugTool(int id, VMDApp *vmdapp, Displayable *disp) 00028 : Tool(id, vmdapp, disp) { 00029 int i; 00030 for(i=0;i<3;i++) offset[i]=0; 00031 tugging=0; 00032 springscale = 1.0; 00033 } 00034 00035 void TugTool::do_event() { 00036 00037 if(!tugging) { // we haven't started tugging, update UIVR 00038 tool_location_update(); 00039 } 00040 00041 if (istugging()) { // Tugging is enabled... 00042 if (!tugging || !is_targeted()) { // but we're not tugging now 00043 if(!target(TARGET_TUG, tugged_pos, 0)) { 00044 // Didn't pick anything, so return 00045 tugging = 0; 00046 return; 00047 } 00048 tugging = 1; 00049 // We're starting the force field, so set the offset 00050 vec_sub(offset, Tool::position(), tugged_pos); 00051 start_tug(); 00052 } 00053 target(TARGET_TUG, tugged_pos, 1); 00054 // Apply the force field... 00055 float offset_tugged_pos[3]; // offset+tugged_pos 00056 vec_add(offset_tugged_pos,offset,tugged_pos); 00057 set_tug_constraint(offset_tugged_pos); 00058 00059 // and send the proper force to UIVR for display and possible 00060 // export 00061 float diff[3]; 00062 vec_sub(diff, Tool::position(), offset_tugged_pos); 00063 // diff now is in my units, but we should do it in mol units 00064 vec_scale(diff,dtool->scale/getTargetScale(),diff); 00065 // scale by the force scaling spring constant 00066 vec_scale(diff,forcescale,diff); 00067 do_tug(diff); 00068 } 00069 else if (tugging) { // Tugging has been disabled, so turn it off. 00070 let_go(); 00071 tugging = 0; 00072 forceoff(); 00073 offset[0]=offset[1]=offset[2]=0; 00074 } 00075 } 00076 00077 void TugTool::set_tug_constraint(float *cpos) { 00078 setconstraint(50, cpos); 00079 sendforce(); 00080 } 00081 00082 void TugTool::do_tug(float *force) { 00083 tug(force); 00084 } 00085