本文整理汇总了Python中JSBSim_utils.CreateFDM.load_script方法的典型用法代码示例。如果您正苦于以下问题:Python CreateFDM.load_script方法的具体用法?Python CreateFDM.load_script怎么用?Python CreateFDM.load_script使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类JSBSim_utils.CreateFDM
的用法示例。
在下文中一共展示了CreateFDM.load_script方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: testFunctionWithIndexedProps
# 需要导入模块: from JSBSim_utils import CreateFDM [as 别名]
# 或者: from JSBSim_utils.CreateFDM import load_script [as 别名]
def testFunctionWithIndexedProps(self):
tree = et.parse(self.sandbox.path_to_jsbsim_file('engine',
'eng_PegasusXc.xml'))
# Define the function starter-max-power-W as a 'post' function
root = tree.getroot()
startPowFunc_tag = root.find("function/[@name='propulsion/engine[#]/starter-max-power-W']")
startPowFunc_tag.attrib['type']='post'
tree.write('eng_PegasusXc.xml')
# Copy the propeller file.
shutil.copy(self.sandbox.path_to_jsbsim_file('engine', 'prop_deHavilland5000.xml'),
'.')
fdm = CreateFDM(self.sandbox)
fdm.set_engine_path('.')
fdm.load_script(self.sandbox.path_to_jsbsim_file('scripts',
'Short_S23_1.xml'))
fdm.run_ic()
pm = fdm.get_property_manager()
self.assertTrue(pm.hasNode('propulsion/engine[0]/starter-max-power-W'))
self.assertTrue(pm.hasNode('propulsion/engine[1]/starter-max-power-W'))
self.assertTrue(pm.hasNode('propulsion/engine[2]/starter-max-power-W'))
self.assertTrue(pm.hasNode('propulsion/engine[3]/starter-max-power-W'))
while fdm.run():
rpm = [fdm['propulsion/engine[0]/engine-rpm'],
fdm['propulsion/engine[1]/engine-rpm'],
fdm['propulsion/engine[2]/engine-rpm'],
fdm['propulsion/engine[3]/engine-rpm']]
for i in range(4):
maxPower = max(0.0, 1.0-rpm[i]/400)*498.941*0.10471976*rpm[i]
self.assertAlmostEqual(fdm['propulsion/engine[%d]/starter-max-power-W' % (i,)],
maxPower)
示例2: testOrbit
# 需要导入模块: from JSBSim_utils import CreateFDM [as 别名]
# 或者: from JSBSim_utils.CreateFDM import load_script [as 别名]
def testOrbit(self):
script_name = 'ball_orbit.xml'
script_path = self.sandbox.path_to_jsbsim_file('scripts', script_name)
self.AddAccelerometersToAircraft(script_path)
# The time step is too small in ball_orbit so let's increase it to 0.1s
# for a quicker run
tree = et.parse(script_path)
run_tag = tree.getroot().find('./run')
run_tag.attrib['dt'] = '0.1'
tree.write(script_name)
fdm = CreateFDM(self.sandbox)
fdm.set_aircraft_path('aircraft')
fdm.load_script(script_name)
# Switch the accel on
fdm['fcs/accelerometer/on'] = 1.0
fdm.run_ic()
while fdm.run():
self.assertAlmostEqual(fdm['fcs/accelerometer/X'], 0.0, delta=1E-8)
self.assertAlmostEqual(fdm['fcs/accelerometer/Y'], 0.0, delta=1E-8)
self.assertAlmostEqual(fdm['fcs/accelerometer/Z'], 0.0, delta=1E-8)
self.assertAlmostEqual(fdm['accelerations/a-pilot-x-ft_sec2'], 0.0,
delta=1E-8)
self.assertAlmostEqual(fdm['accelerations/a-pilot-y-ft_sec2'], 0.0,
delta=1E-8)
self.assertAlmostEqual(fdm['accelerations/a-pilot-z-ft_sec2'], 0.0,
delta=1E-8)
del fdm
示例3: test_fuel_tanks_content
# 需要导入模块: from JSBSim_utils import CreateFDM [as 别名]
# 或者: from JSBSim_utils.CreateFDM import load_script [as 别名]
def test_fuel_tanks_content(self):
script_path = self.sandbox.path_to_jsbsim_file('scripts', 'J2460.xml')
fdm = CreateFDM(self.sandbox)
fdm.load_script(script_path)
fdm.run_ic()
tree = et.parse(script_path)
use_tag = tree.getroot().find('use')
aircraft_name = use_tag.attrib['aircraft']
aircraft_path = self.sandbox.path_to_jsbsim_file('aircraft',
aircraft_name)
aircraft_tree = et.parse(os.path.join(aircraft_path,
aircraft_name+'.xml'))
total_fuel_quantity = 0.0
total_oxidizer_quantity = 0.0
for tank in aircraft_tree.findall('propulsion/tank'):
contents = float(tank.find('contents').text)
if tank.attrib['type'] == "FUEL":
total_fuel_quantity += contents
elif tank.attrib['type'] == 'OXIDIZER':
total_oxidizer_quantity += contents
self.assertAlmostEqual(fdm['propulsion/total-fuel-lbs'],
total_fuel_quantity)
self.assertAlmostEqual(fdm['propulsion/total-oxidizer-lbs'],
total_oxidizer_quantity)
示例4: Compare
# 需要导入模块: from JSBSim_utils import CreateFDM [as 别名]
# 或者: from JSBSim_utils.CreateFDM import load_script [as 别名]
def Compare(self, section):
# Rerun the script with the modified aircraft definition
self.sandbox.delete_csv_files()
fdm = CreateFDM(self.sandbox)
# We need to tell JSBSim that the aircraft definition is located in the
# directory build/.../aircraft
fdm.set_aircraft_path('aircraft')
fdm.set_output_directive(self.sandbox.path_to_jsbsim_file('tests',
'output.xml'))
fdm.load_script(self.script)
fdm['simulation/randomseed'] = 0.0
fdm.run_ic()
ExecuteUntil(fdm, 50.0)
mod = pd.read_csv('output.csv', index_col=0)
# Check the data are matching i.e. the time steps are the same between
# the two data sets and that the output data are also the same.
self.assertTrue(isDataMatching(self.ref, mod))
# Whether the data is read from the aircraft definition file or from an
# external file, the results shall be exactly identical. Hence the
# precision set to 0.0.
diff = FindDifferences(self.ref, mod, 0.0)
self.assertEqual(len(diff), 0,
msg='\nTesting section "'+section+'"\n'+diff.to_string())
示例5: test_gust_reset
# 需要导入模块: from JSBSim_utils import CreateFDM [as 别名]
# 或者: from JSBSim_utils.CreateFDM import load_script [as 别名]
def test_gust_reset(self):
fdm = CreateFDM(self.sandbox)
fdm.load_script(self.sandbox.path_to_jsbsim_file('scripts',
'c172_cruise_8K.xml'))
fdm['simulation/randomseed'] = 0.0
fdm.set_output_directive(self.sandbox.path_to_jsbsim_file('tests', 'output.xml'))
fdm.run_ic()
ExecuteUntil(fdm, 15.5)
ref = pd.read_csv('output.csv', index_col=0)
fdm['simulation/randomseed'] = 0.0
fdm.reset_to_initial_conditions(1)
ExecuteUntil(fdm, 15.5)
current = pd.read_csv('output_0.csv', index_col=0)
# Check the data are matching i.e. the time steps are the same between
# the two data sets and that the output data are also the same.
self.assertTrue(isDataMatching(ref, current))
# Find all the data that are differing by more than 1E-8 between the
# two data sets.
diff = FindDifferences(ref, current, 1E-8)
self.longMessage = True
self.assertEqual(len(diff), 0, msg='\n'+diff.to_string())
示例6: test_wind_frame
# 需要导入模块: from JSBSim_utils import CreateFDM [as 别名]
# 或者: from JSBSim_utils.CreateFDM import load_script [as 别名]
def test_wind_frame(self):
script_path = self.sandbox.path_to_jsbsim_file('scripts',
'ball_chute.xml')
fdm = CreateFDM(self.sandbox)
fdm.load_script(script_path)
fdm.run_ic()
self.assertAlmostEqual(fdm['external_reactions/parachute/location-x-in'],
12.0)
self.assertAlmostEqual(fdm['external_reactions/parachute/location-y-in'],
0.0)
self.assertAlmostEqual(fdm['external_reactions/parachute/location-z-in'],
0.0)
self.assertAlmostEqual(fdm['external_reactions/parachute/x'], -1.0)
self.assertAlmostEqual(fdm['external_reactions/parachute/y'], 0.0)
self.assertAlmostEqual(fdm['external_reactions/parachute/z'], 0.0)
while fdm.run():
Tw2b = fdm.get_auxiliary().get_Tw2b()
mag = fdm['aero/qbar-psf'] * fdm['fcs/parachute_reef_pos_norm']*20.0
f = Tw2b * np.mat([-1.0, 0.0, 0.0]).T * mag
self.assertAlmostEqual(fdm['forces/fbx-external-lbs'], f[0, 0])
self.assertAlmostEqual(fdm['forces/fby-external-lbs'], f[1, 0])
self.assertAlmostEqual(fdm['forces/fbz-external-lbs'], f[2, 0])
m = np.cross(self.getLeverArm(fdm,'parachute'),
np.array([f[0,0], f[1,0], f[2, 0]]))
self.assertAlmostEqual(fdm['moments/l-external-lbsft'], m[0])
self.assertAlmostEqual(fdm['moments/m-external-lbsft'], m[1])
self.assertAlmostEqual(fdm['moments/n-external-lbsft'], m[2])
示例7: testDebugLvl
# 需要导入模块: from JSBSim_utils import CreateFDM [as 别名]
# 或者: from JSBSim_utils.CreateFDM import load_script [as 别名]
def testDebugLvl(self):
fdm = CreateFDM(self.sandbox)
fdm.load_script(self.sandbox.path_to_jsbsim_file('scripts',
'ball_orbit.xml'))
fdm.run_ic()
ExecuteUntil(fdm, 1000.)
ref = pd.read_csv('BallOut.csv', index_col=0)
del fdm
os.environ["JSBSIM_DEBUG"] = str(0)
fdm = CreateFDM(self.sandbox)
fdm.load_script(self.sandbox.path_to_jsbsim_file('scripts',
'ball_orbit.xml'))
fdm.run_ic()
ExecuteUntil(fdm, 1000.)
current = pd.read_csv('BallOut.csv', index_col=0)
# Check the data are matching i.e. the time steps are the same between
# the two data sets and that the output data are also the same.
self.assertTrue(isDataMatching(ref, current))
# Find all the data that are differing by more than 1E-8 between the
# two data sets.
diff = FindDifferences(ref, current, 1E-8)
self.longMessage = True
self.assertEqual(len(diff), 0, msg='\n'+diff.to_string())
示例8: test_hold_down_with_gnd_reactions
# 需要导入模块: from JSBSim_utils import CreateFDM [as 别名]
# 或者: from JSBSim_utils.CreateFDM import load_script [as 别名]
def test_hold_down_with_gnd_reactions(self):
fdm = CreateFDM(self.sandbox)
fdm.load_script(self.sandbox.path_to_jsbsim_file('scripts',
'c1721.xml'))
fdm.run_ic()
ExecuteUntil(fdm, 0.25)
fdm['forces/hold-down'] = 1.0
h0 = fdm['position/h-sl-ft']
pitch = fdm['attitude/pitch-rad']
roll = fdm['attitude/roll-rad']
heading = fdm['attitude/heading-true-rad']
while fdm['simulation/sim-time-sec'] < 2.0:
fdm.run()
self.assertAlmostEqual(fdm['accelerations/pdot-rad_sec2'], 0.0)
self.assertAlmostEqual(fdm['accelerations/qdot-rad_sec2'], 0.0)
self.assertAlmostEqual(fdm['accelerations/rdot-rad_sec2'], 0.0)
self.assertAlmostEqual(fdm['accelerations/udot-ft_sec2'], 0.0)
self.assertAlmostEqual(fdm['accelerations/vdot-ft_sec2'], 0.0)
self.assertAlmostEqual(fdm['accelerations/wdot-ft_sec2'], 0.0)
self.assertAlmostEqual(fdm['position/h-sl-ft'], h0, delta=1E-6)
self.assertAlmostEqual(fdm['attitude/pitch-rad'], pitch)
self.assertAlmostEqual(fdm['attitude/roll-rad'], roll)
self.assertAlmostEqual(fdm['attitude/heading-true-rad'], heading)
示例9: test_output
# 需要导入模块: from JSBSim_utils import CreateFDM [as 别名]
# 或者: from JSBSim_utils.CreateFDM import load_script [as 别名]
def test_output(self):
tree = et.parse(self.script_path)
output_tag = et.SubElement(tree.getroot(), 'output')
output_tag.attrib['name'] = 'test.csv'
output_tag.attrib['type'] = 'CSV'
output_tag.attrib['rate'] = '10'
property_tag = et.SubElement(output_tag, 'property')
property_tag.text = 'position/vrp-radius-ft'
tree.write('c1722_0.xml')
fdm = CreateFDM(self.sandbox)
fdm.load_script('c1722_0.xml')
fdm.run_ic()
ExecuteUntil(fdm, 10.)
self.assertTrue(self.sandbox.exists(output_tag.attrib['name']),
msg="The file 'output.csv' has not been created")
orig = pd.read_csv('JSBout172B.csv', index_col=0)
test = pd.read_csv('test.csv', index_col=0)
pname = '/fdm/jsbsim/' + property_tag.text
ref = orig[pname]
mod = test[pname]
# Check the data are matching i.e. the time steps are the same between
# the two data sets.
self.assertTrue(isDataMatching(ref, mod))
# Find all the data that are differing by more than 1E-8 between the
# two data sets.
delta = pd.concat([np.abs(ref - mod), ref, mod], axis=1)
delta.columns = ['delta', 'ref value', 'value']
diff = delta[delta['delta'] > 1E-8]
self.longMessage = True
self.assertEqual(len(diff), 0, msg='\n'+diff.to_string())
示例10: test_CAS_ic
# 需要导入模块: from JSBSim_utils import CreateFDM [as 别名]
# 或者: from JSBSim_utils.CreateFDM import load_script [as 别名]
def test_CAS_ic(self):
script_name = 'Short_S23_3.xml'
script_path = self.sandbox.path_to_jsbsim_file('scripts', script_name)
# Add a Pitot angle to the Short S23
tree, aircraft_name, path_to_jsbsim_aircrafts = CopyAircraftDef(script_path, self.sandbox)
self.addPitotTube(tree.getroot(), 5.0)
tree.write(self.sandbox('aircraft', aircraft_name,
aircraft_name+'.xml'))
# Read the CAS specified in the IC file
tree = et.parse(script_path)
use_element = tree.getroot().find('use')
IC_file = use_element.attrib['initialize']
tree = et.parse(os.path.join(path_to_jsbsim_aircrafts,
append_xml(IC_file)))
vc_tag = tree.getroot().find('./vc')
VCAS = float(vc_tag.text)
if 'unit' in vc_tag.attrib and vc_tag.attrib['unit'] == 'FT/SEC':
VCAS /= 1.68781 # Converts in kts
# Run the IC and check that the model is initialized correctly
fdm = CreateFDM(self.sandbox)
fdm.set_aircraft_path('aircraft')
fdm.load_script(script_path)
fdm.run_ic()
self.assertAlmostEqual(fdm['ic/vc-kts'], VCAS, delta=1E-7)
self.assertAlmostEqual(fdm['velocities/vc-kts'], VCAS, delta=1E-7)
示例11: test_fuel_tanks_inertia
# 需要导入模块: from JSBSim_utils import CreateFDM [as 别名]
# 或者: from JSBSim_utils.CreateFDM import load_script [as 别名]
def test_fuel_tanks_inertia(self):
script_path = self.sandbox.path_to_jsbsim_file('scripts', 'c1722.xml')
# The aircraft c172x does not contain an <inertia_factor> tag so we
# need to add one.
tree, aircraft_name, b = CopyAircraftDef(script_path, self.sandbox)
tank_tag = tree.getroot().find('propulsion/tank')
inertia_factor = et.SubElement(tank_tag, 'inertia_factor')
inertia_factor.text = '1.0'
tree.write(self.sandbox('aircraft', aircraft_name,
aircraft_name+'.xml'))
fdm = CreateFDM(self.sandbox)
fdm.set_aircraft_path('aircraft')
fdm.load_script(script_path)
fdm.run_ic()
contents0 = fdm['propulsion/tank/contents-lbs']
ixx0 = fdm['propulsion/tank/local-ixx-slug_ft2']
iyy0 = fdm['propulsion/tank/local-iyy-slug_ft2']
izz0 = fdm['propulsion/tank/local-izz-slug_ft2']
# Remove half of the tank contents and check that the inertias are
# updated accordingly
fdm['propulsion/tank/contents-lbs'] = 0.5*contents0
contents = fdm['propulsion/tank/contents-lbs']
ixx = fdm['propulsion/tank/local-ixx-slug_ft2']
iyy = fdm['propulsion/tank/local-iyy-slug_ft2']
izz = fdm['propulsion/tank/local-izz-slug_ft2']
self.assertAlmostEqual(contents, 0.5*contents0, delta=1E-7,
msg="The tank content (%f lbs) should be %f lbs" % (contents, 0.5*contents0))
self.assertAlmostEqual(ixx, 0.5*ixx0, delta=1E-7,
msg="The tank inertia Ixx (%f slug*ft^2) should be %f slug*ft^2" % (ixx, 0.5*ixx0))
self.assertAlmostEqual(iyy, 0.5*iyy0, delta=1E-7,
msg="The tank inertia Iyy (%f slug*ft^2) should be %f slug*ft^2" % (iyy, 0.5*iyy0))
self.assertAlmostEqual(izz, 0.5*izz0, delta=1E-7,
msg="The tank inertia Izz (%f slug*ft^2) should be %f slug*ft^2" % (izz, 0.5*izz0))
# Execute the script and check that the fuel inertias have been updated
# along with the consumption.
ExecuteUntil(fdm, 200.0)
contents = fdm['propulsion/tank/contents-lbs']
ixx = fdm['propulsion/tank/local-ixx-slug_ft2']
iyy = fdm['propulsion/tank/local-iyy-slug_ft2']
izz = fdm['propulsion/tank/local-izz-slug_ft2']
contents_ratio = contents / contents0
ixx_ratio = ixx / ixx0
iyy_ratio = iyy / iyy0
izz_ratio = izz / izz0
self.assertAlmostEqual(contents_ratio, ixx_ratio, delta=1E-7,
msg="Ixx does not vary as the tank content does\nIxx ratio=%f\nContents ratio=%f" % (ixx_ratio, contents_ratio))
self.assertAlmostEqual(contents_ratio, iyy_ratio, delta=1E-7,
msg="Iyy does not vary as the tank content does\nIyy ratio=%f\nContents ratio=%f" % (iyy_ratio, contents_ratio))
self.assertAlmostEqual(contents_ratio, izz_ratio, delta=1E-7,
msg="Izz does not vary as the tank content does\nIzz ratio=%f\nContents ratio=%f" % (izz_ratio, contents_ratio))
示例12: test_no_input
# 需要导入模块: from JSBSim_utils import CreateFDM [as 别名]
# 或者: from JSBSim_utils.CreateFDM import load_script [as 别名]
def test_no_input(self):
fdm = CreateFDM(self.sandbox)
fdm.load_script(self.script_path)
fdm.run_ic()
fdm.hold()
with self.assertRaises(socket.error):
TelnetInterface(fdm, 5., 1137)
示例13: test_no_output
# 需要导入模块: from JSBSim_utils import CreateFDM [as 别名]
# 或者: from JSBSim_utils.CreateFDM import load_script [as 别名]
def test_no_output(self):
fdm = CreateFDM(self.sandbox)
fdm.load_script(self.script_path)
fdm.run_ic()
ExecuteUntil(fdm, 10.)
self.assertFalse(self.sandbox.exists('output.csv'),
msg="Results have unexpectedly been written to 'output.csv'")
示例14: testSteadyFlight
# 需要导入模块: from JSBSim_utils import CreateFDM [as 别名]
# 或者: from JSBSim_utils.CreateFDM import load_script [as 别名]
def testSteadyFlight(self):
script_name = 'c1722.xml'
script_path = self.sandbox.path_to_jsbsim_file('scripts', script_name)
self.AddAccelerometersToAircraft(script_path)
fdm = CreateFDM(self.sandbox)
fdm.set_aircraft_path('aircraft')
fdm.load_script(script_path)
# Switch the accel on
fdm['fcs/accelerometer/on'] = 1.0
# Use the standard gravity (i.e. GM/r^2)
fdm['simulation/gravity-model'] = 0
# Select an orientation such that frame transformations simplify
fdm['ic/psi-true-rad'] = 0.0
fdm.run_ic()
ExecuteUntil(fdm, 0.1)
fdm['simulation/do_simple_trim'] = 1
r = fdm['position/radius-to-vehicle-ft']
pitch = fdm['attitude/theta-rad']
roll = fdm['attitude/phi-rad']
latitude = fdm['position/lat-gc-rad']
g = fdm['accelerations/gravity-ft_sec2']
omega = 0.00007292115 # Earth rotation rate in rad/sec
fc = r * math.cos(latitude) * omega * omega # Centrifugal force
uvw = np.array(fdm.get_propagate().get_uvw().T)[0]
Omega = omega * np.array([math.cos(pitch - latitude),
math.sin(pitch - latitude) * math.sin(roll),
math.sin(pitch - latitude) * math.cos(roll)])
# Compute the acceleration measured by the accelerometer as the sum of
# the gravity and the centrifugal and Coriolis forces.
fa_yz = (fc * math.cos(latitude - pitch) - g * math.cos(pitch))
fa = np.array([(fc * math.sin(latitude - pitch) + g * math.sin(pitch)),
fa_yz * math.sin(roll),
fa_yz * math.cos(roll)]) + np.cross(2.0*Omega, uvw)
# After the trim we are close to the equilibrium but there remains a
# small residual that we have to take the bias into account
fax = fa[0] + fdm['accelerations/udot-ft_sec2']
fay = fa[1] + fdm['accelerations/vdot-ft_sec2']
faz = fa[2] + fdm['accelerations/wdot-ft_sec2']
# Deltas are relaxed because the tolerances of the trimming algorithm
# are quite relaxed themselves.
self.assertAlmostEqual(fdm['fcs/accelerometer/X'], fax, delta=1E-6)
self.assertAlmostEqual(fdm['fcs/accelerometer/Y'], fay, delta=1E-4)
self.assertAlmostEqual(fdm['fcs/accelerometer/Z'], faz, delta=1E-5)
del fdm
示例15: testEnginePowerVC
# 需要导入模块: from JSBSim_utils import CreateFDM [as 别名]
# 或者: from JSBSim_utils.CreateFDM import load_script [as 别名]
def testEnginePowerVC(self):
# Check that the same results are obtained whether the engine power
# velocity correction is given in a <table> or <function>
fdm = CreateFDM(self.sandbox)
fdm.load_script(self.sandbox.path_to_jsbsim_file('scripts',
'L4102.xml'))
fdm.run_ic()
while fdm.run():
pass
del fdm
ref = pd.read_csv('L410.csv', index_col=0)
tree = et.parse(self.sandbox.path_to_jsbsim_file('engine',
'engtm601.xml'))
# Modify the engine definition to use a <function> rather than a
# <table> component.
root = tree.getroot()
engPowVC_tag = root.find("table/[@name='EnginePowerVC']")
root.remove(engPowVC_tag)
del engPowVC_tag.attrib['name']
func_engPowVC = et.SubElement(root, 'function')
func_engPowVC.attrib['name'] = 'EnginePowerVC'
func_engPowVC.append(engPowVC_tag)
tree.write('engtm601.xml')
# Copy the propeller file.
shutil.copy(self.sandbox.path_to_jsbsim_file('engine', 'vrtule2.xml'),
'.')
self.sandbox.delete_csv_files()
fdm = CreateFDM(self.sandbox)
fdm.set_engine_path('.')
fdm.load_script(self.sandbox.path_to_jsbsim_file('scripts',
'L4102.xml'))
fdm.run_ic()
while fdm.run():
pass
current = pd.read_csv('L410.csv', index_col=0)
# Check the data are matching i.e. the time steps are the same between
# the two data sets and that the output data are also the same.
self.assertTrue(isDataMatching(ref, current))
# Find all the data that are differing by more than 1E-5 between the
# two data sets.
diff = FindDifferences(ref, current, 0.0)
self.longMessage = True
self.assertEqual(len(diff), 0, msg='\n'+diff.to_string())