Path: blob/main/tools/contributed/sumopy/agilepy/lib_base/test_classman_save.py
169689 views
# Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo1# Copyright (C) 2016-2025 German Aerospace Center (DLR) and others.2# SUMOPy module3# Copyright (C) 2012-2021 University of Bologna - DICAM4# This program and the accompanying materials are made available under the5# terms of the Eclipse Public License 2.0 which is available at6# https://www.eclipse.org/legal/epl-2.0/7# This Source Code may also be made available under the following Secondary8# Licenses when the conditions for such availability set forth in the Eclipse9# Public License 2.0 are satisfied: GNU General Public License, version 210# or later which is available at11# https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html12# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later1314# @file test_classman_save.py15# @author Joerg Schweizer16# @date 20121718#from classman import *1920from test_classman_classes import *21from arrayman import *22import xmlman as xm23# TODOD: create a test object with all tests24is_all = 0252627if 0 | is_all:28class Lines(ArrayObjman):2930def __init__(self, ident, parent=None, xmltag=('lines', 'line', 'ids_sumo'), **kwargs):3132self._init_objman(ident, parent=parent, is_plugin=True, xmltag=xmltag, **kwargs)3334self.add(AttrConf('offset', 0.0,35groupnames=['state'],36perm='r',37is_save=True,38unit='m',39metatype='length',40is_plugin=False,41name='offset',42info='Test offset position',43#xmltag = 'offset',44))4546self.add_col(ArrayConf('vertices', np.zeros((2, 3), float),47groupnames=['internal'],48perm='rw',49name='Vertex',50is_save=True,51is_plugin=True,52info='Vertex coordinate vectors of points. with format [[[x11,y11,z11],[x12,y12,z12]],[[x21,y21,z21],[x22,y22,z122]],...]',53xmltag='vertices',54))5556self.add_col(ArrayConf('polygons', None,57dtype='object',58groupnames=['landuse'],59perm='rw',60name='Polygon',61info='Polygons [[ (x11,y11,z11), (x12,y12,z13), (x13, y13,z13),...],[...]]',62xmltag='shapes',63))6465self.add_col(ArrayConf('ids_sumo', None,66dtype='object',67is_index=True,68perm='rw',69name='Polygon',70info='Polygons [[ (x11,y11,z11), (x12,y12,z13), (x13, y13,z13),...],[...]]',71xmltag='id_geom',72))7374###########################################################################75# Instance creation7677lines = Lines('lines')78# vertices = [ [0.0,10.0,10.0,10.0,10.0,0.0],79# [10.0,20.0,20.0,20.0,20.0,10.0],80# [20.0,30.0,30.0,20.0,30.0,20.0],81# ]8283# vertices = [ [(0.0,10.0),(10.0,10.0)],84# [(10.0,20.0),(20.0,20.0)],85# [(20.0,30.0),(30.0,20.0)],86# ]87vertices = [88[[0.0, 0.0, 0.0], [0.2, 0.0, 0.0]], # 089[[0.3, 0.0, 0.0], [0.9, 0.0, 0.0]], # 190[[0.5, 0.0, 0.1], [1.9, 0.0, 0.0]], # 291]92polygons = [93np.array([[0.0, 0.0, 0.0], [0.2, 0.0, 0.0], [0.2, 0.0, 0.1], [0.3, 0.3, 0.3]]), # 094np.array([[0.3, 0.0, 0.0], [0.9, 0.0, 0.0]]), # 195np.array([[0.5, 0.0, 0.1], [1.9, 0.0, 0.0], [0.2, 0.2, 0.2]]), # 296]97ids_sumo = ['aa10', 'bb22', 'cc333']98# lines.add_rows(3)99lines.add_rows(3, vertices=vertices, polygons=polygons, ids_sumo=ids_sumo)100lines.print_attrs()101102xm.write_obj_to_xml(lines, 'test_lines.xml')103104# save/load105save_obj(lines, 'test_lines.obj')106del lines107print '\nreload'+60*'.'108lines = load_obj('test_lines.obj')109lines.print_attrs()110111print 'direct access vertex=\n', lines.vertices.value112print 'direct access polygons=\n', lines.polygons.value113print 'id for index bb22=', lines.ids_sumo.get_id_from_index('bb22')114print 'ids for index bb22,cc333=', lines.ids_sumo.get_ids_from_indices(['bb22', 'cc333'])115lines.del_row(2)116lines.print_attrs()117print 'id for index bb22=', lines.ids_sumo.get_id_from_index('cc333')118119if 0 | is_all:120class Lines(ArrayObjman):121122def __init__(self, ident, parent=None, **kwargs):123124self._init_objman(ident, parent=parent, **kwargs)125126self.add_col(ArrayConf('vertices', np.zeros((2, 3), float),127groupnames=['internal'],128perm='rw',129name='Vertex',130is_save=True,131info='Vertex coordinate vectors of points. with format [[[x11,y11,z11],[x12,y12,z12]],[[x21,y21,z21],[x22,y22,z122]],...]',132))133134self.add_col(ArrayConf('polygons', None,135dtype='object',136groupnames=['landuse'],137perm='rw',138name='Polygon',139info='Polygons [[ (x11,y11,z11), (x12,y12,z13), (x13, y13,z13),...],[...]]',140))141142###########################################################################143# Instance creation144145lines = Lines('lines')146# vertices = [ [0.0,10.0,10.0,10.0,10.0,0.0],147# [10.0,20.0,20.0,20.0,20.0,10.0],148# [20.0,30.0,30.0,20.0,30.0,20.0],149# ]150151# vertices = [ [(0.0,10.0),(10.0,10.0)],152# [(10.0,20.0),(20.0,20.0)],153# [(20.0,30.0),(30.0,20.0)],154# ]155vertices = [156[[0.0, 0.0, 0.0], [0.2, 0.0, 0.0]], # 0157[[0.3, 0.0, 0.0], [0.9, 0.0, 0.0]], # 1158[[0.5, 0.0, 0.1], [1.9, 0.0, 0.0]], # 2159]160polygons = [161np.array([[0.0, 0.0, 0.0], [0.2, 0.0, 0.0], [0.2, 0.0, 0.1], [0.3, 0.3, 0.3]]), # 0162np.array([[0.3, 0.0, 0.0], [0.9, 0.0, 0.0]]), # 1163np.array([[0.5, 0.0, 0.1], [1.9, 0.0, 0.0], [0.2, 0.2, 0.2]]), # 2164]165# lines.add_rows(3)166lines.add_rows(3, vertices=vertices, polygons=polygons)167lines.print_attrs()168print 'direct access vertex=\n', lines.vertices.value169print 'direct access polygons=\n', lines.polygons.value170171# save/load172save_obj(lines, 'test_lines.obj')173del lines174print '\nreload'+60*'.'175lines = load_obj('test_lines.obj')176177178lines.print_attrs()179print 'direct access vertex=\n', lines.vertices.value180print 'direct access polygons=\n', lines.polygons.value181182vertices2 = [183[[0.0, 0.0, 0.0], [0.2, 0.0, 0.0]], # 0184[[0.3, 0.0, 0.0], [0.9, 0.0, 0.0]], # 1185[[0.5, 0.0, 0.1], [1.9, 0.0, 0.0]], # 2186]187polygons2 = [188np.array([[0.0, 0.0, 0.0], [0.2, 0.0, 0.0], [0.2, 0.0, 0.1], [0.3, 0.3, 0.3]]), # 0189np.array([[0.3, 0.0, 0.0], [0.9, 0.0, 0.0]]), # 1190np.array([[0.5, 0.0, 0.1], [1.9, 0.0, 0.0], [0.2, 0.2, 0.2]]), # 2191]192lines.add_rows(3, vertices=vertices2, polygons=polygons2)193lines.print_attrs()194195if 0 | is_all:196class ZonesTab(ArrayObjman):197def __init__(self, ident, parent=None, **kwargs):198self._init_objman(ident, parent=parent, xmltag=('taz', 'district', 'zonenames'), **kwargs)199200self.add_col(ArrayConf('zonenames', None,201dtype='object',202is_index=True,203perm='rw',204name='Zone names',205info='Name of zone',206xmltag='zone',207))208209self.add_col(ColConf('shapes', [],210groupnames=['state'],211perm='rw',212is_save=True,213name='Shape',214info='Shape of zone which is a list of (x,y) coordinates',215xmltag='shape'216))217218class OdTripsTab(ArrayObjman):219def __init__(self, ident, parent, zones, **kwargs):220self._init_objman(ident, parent=parent, xmltag=('odtrips', 'odtrip', None), **kwargs)221222self.add_col(IdsConf('ids_orig', zones, is_child=False,223groupnames=['state'],224is_save=True,225name='ID Orig',226info='ID of traffic assignment zone of origin of trip.',227xmltag='id_orig',228))229230self.add_col(IdsConf('ids_dest', zones, is_child=False,231groupnames=['state'],232is_save=True,233name='ID Dest',234info='ID of traffic assignment zone of destination of trip.',235xmltag='id_dest',236))237238self.add_col(ColConf('tripnumbers', 0,239groupnames=['state'],240perm='rw',241is_save=True,242name='Trip number',243info='Number of trips from zone with ID Orig to zone with ID Dest.',244xmltag='tripnumber',245))246247class OdModesTab(ArrayObjman):248def __init__(self, ident, parent=None, **kwargs):249self._init_objman(ident, parent=parent, xmltag=('odmodes', 'odmode', 'modes'), **kwargs)250251self.add_col(ArrayConf('modes', None,252dtype='object',253is_index=True,254perm='rw',255name='Mode',256info='Mode of transport',257xmltag='mode',258))259self.add_col(ObjsConf('odtrips',260groupnames=['state'],261is_save=True,262name='OD matrix',263info='Matrix with trips from origin to destintion',264))265266class OdIntervalsTab(ArrayObjman):267def __init__(self, ident, parent=None, **kwargs):268self._init_objman(ident, parent=parent, xmltag=('odintervals', 'odinteval', None), **kwargs)269270self.add_col(ColConf('t_start', 0.0,271groupnames=['state'],272perm='rw',273is_save=True,274name='Start time',275unit='s',276info='Start time of interval',277xmltag='t_start',278))279280self.add_col(ColConf('t_end', 3600.0,281groupnames=['state'],282perm='rw',283is_save=True,284name='End time',285unit='s',286info='End time of interval',287xmltag='t_end',288))289290self.add_col(ObjsConf('odmodes',291groupnames=['state'],292is_save=True,293name='Modes',294info='Transport mode',295))296297###########################################################################298# Instance creation299300demand = BaseObjman('demand', xmltag='demand')301302zones = ZonesTab('zones', parent=demand)303demand.zones = demand.get_attrsman().add(ObjConf(zones))304shapes = [[(0.0, 10.0), (10.0, 10.0), (10.0, 0.0)],305[(10.0, 20.0), (20.0, 20.0), (20.0, 10.0)],306[(20.0, 30.0), (30.0, 20.0), (30.0, 20.0)],307]308zones.add_rows(3, shapes=shapes, zonenames=['center', 'periphery', 'residential'])309310odintervals = OdIntervalsTab('odintervals', parent=demand, info='OD data for different time intervals')311demand.odintervals = demand.get_attrsman().add(ObjConf(odintervals))312odintervals.add_rows(2, t_start=[0, 3601], t_end=[3600, 7200])313for id_odmodes in odintervals.get_ids():314odmodes = OdModesTab((odintervals.odmodes.attrname, id_odmodes), parent=odintervals)315odintervals.odmodes[id_odmodes] = odmodes316317odmodes.add_rows(2, modes=['bus', 'train'])318for id_odtrips in odmodes.get_ids():319odtrips = OdTripsTab((odmodes.odtrips.attrname, id_odtrips), odmodes, zones)320odtrips.add_rows(3, ids_orig=[3, 2, 1], ids_dest=[3, 3, 3], tripnumbers=[10, 200, 555])321odmodes.odtrips[id_odtrips] = odtrips322323324demand.get_attrsman().print_attrs()325odintervals.print_attrs()326for id_odmodes in odintervals.get_ids():327print '\nMODE:'328odintervals.odmodes[id_odmodes].print_attrs()329print '\nTRIPS:'330for id_odtrips in odmodes.get_ids():331odmodes.odtrips[id_odtrips].print_attrs()332333xm.write_obj_to_xml(demand, 'test_demand.xml')334# save/load335save_obj(demand, 'test_demand_array.obj')336del demand337print '\nreload'+60*'.'338demand = load_obj('test_demand_array.obj')339340341demand.get_attrsman().print_attrs()342odintervals.print_attrs()343for id_odmodes in odintervals.get_ids():344print '\nMODE:'345odintervals.odmodes[id_odmodes].print_attrs()346print '\nTRIPS:'347for id_odtrips in odmodes.get_ids():348odmodes.odtrips[id_odtrips].print_attrs()349350if 0 | is_all: # OLD BROKEN??!!351class ZonesTab(TableObjman):352def __init__(self, ident, parent=None, **kwargs):353self._init_objman(ident, parent=parent, **kwargs)354355self.add_col(ColConf('shapes', [],356groupnames=['state'],357perm='rw',358is_save=True,359name='Shape',360info='Shape of zone which is a list of (x,y) coordinates',361))362363class OdTripsTab(TableObjman):364def __init__(self, ident, parent, zones, **kwargs):365self._init_objman(ident, parent=parent, **kwargs)366367self.add_col(IdsConf('ids_orig', zones, is_child=False,368groupnames=['state'],369is_save=True,370name='ID Orig',371info='ID of traffic assignment zone of origin of trip.',372))373374self.add_col(IdsConf('ids_dest', zones, is_child=False,375groupnames=['state'],376is_save=True,377name='ID Dest',378info='ID of traffic assignment zone of destination of trip.',379))380381self.add_col(ColConf('tripnumbers', 0,382groupnames=['state'],383perm='rw',384is_save=True,385name='Trip number',386info='Number of trips from zone with ID Orig to zone with ID Dest.',387))388389class OdModesTab(TableObjman):390def __init__(self, ident, parent=None, **kwargs):391self._init_objman(ident, parent=parent, **kwargs)392393self.add_col(ObjsConf('odtrips',394groupnames=['state'],395is_save=True,396name='OD matrix',397info='Matrix with trips from origin to destintion',398))399400class OdIntervalsTab(TableObjman):401def __init__(self, ident, parent=None, **kwargs):402self._init_objman(ident, parent=parent, **kwargs)403404self.add_col(ColConf('t_start', 0.0,405groupnames=['state'],406perm='rw',407is_save=True,408name='Start time',409unit='s',410info='Start time of interval',411))412413self.add_col(ColConf('t_end', 3600.0,414groupnames=['state'],415perm='rw',416is_save=True,417name='End time',418unit='s',419info='End time of interval',420))421422self.add_col(ObjsConf('odmodes',423groupnames=['state'],424is_save=True,425name='Modes',426info='Transport mode',427))428429###########################################################################430# Instance creation431432demand = BaseObjman('demand')433434zones = ZonesTab('zones', parent=demand)435demand.zones = demand.get_attrsman().add(ObjConf(zones))436shapes = [[(0.0, 10.0), (10.0, 10.0), (10.0, 0.0)],437[(10.0, 20.0), (20.0, 20.0), (20.0, 10.0)],438[(20.0, 30.0), (30.0, 20.0), (30.0, 20.0)],439]440zones.add_rows(3, shapes=shapes)441442odintervals = OdIntervalsTab('odintervals', parent=demand, info='OD data for different time intervals')443demand.odintervals = demand.get_attrsman().add(ObjConf(odintervals, is_child=True))444odintervals.add_rows(2, t_start=[0, 3600], t_end=[3600, 7200])445for id_odmodes in odintervals.get_ids():446odmodes = OdModesTab((odintervals.odmodes.attrname, id_odmodes), parent=odintervals)447odintervals.odmodes[id_odmodes] = odmodes448449odmodes.add_rows(2)450for id_odtrips in odmodes.get_ids():451odtrips = OdTripsTab((odmodes.odtrips.attrname, id_odtrips), odmodes, zones)452odtrips.add_rows(3, ids_orig=[3, 2, 1], ids_dest=[3, 3, 3], tripnumbers=[10, 200, 555])453odmodes.odtrips[id_odtrips] = odtrips454455456demand.get_attrsman().print_attrs()457odintervals.print_attrs()458for id_odmodes in odintervals.get_ids():459print '\nMODE:'460odintervals.odmodes[id_odmodes].print_attrs()461print '\nTRIPS:'462for id_odtrips in odmodes.get_ids():463odmodes.odtrips[id_odtrips].print_attrs()464465# save/load466save_obj(demand, 'test_demand.obj')467del demand468print '\nreload'+60*'.'469demand = load_obj('test_demand.obj')470471472demand.get_attrsman().print_attrs()473odintervals.print_attrs()474for id_odmodes in odintervals.get_ids():475print '\nMODE:'476odintervals.odmodes[id_odmodes].print_attrs()477print '\nTRIPS:'478for id_odtrips in odmodes.get_ids():479odmodes.odtrips[id_odtrips].print_attrs()480481if 0 | is_all: # OK482net = BaseObjman('net')483484# TODO: could be put in 2 statements485edges = TableObjman('edges', parent=net, info='Network edges')486nodes = TableObjman('nodes', parent=net, info='Network nodes')487488net.edges = net.get_attrsman().add(ObjConf(edges, is_child=True))489net.nodes = net.get_attrsman().add(ObjConf(nodes, is_child=True))490491net.edges.add(AttrConf('status', 'idle',492groupnames=['state'],493is_save=True,494is_plugin=True,495name='Status',496info='System Status',497))498499net.edges.add_col(IdsConf('ids_node_from', net.nodes, is_child=False,500groupnames=['state'],501is_save=True,502#is_plugin = True,503name='ID from nodes',504info='ID from nodes',505))506507net.edges.add_col(IdsConf('ids_node_to', net.nodes, is_child=False,508groupnames=['state'],509is_save=True,510name='ID to nodes',511info='ID to nodes',512))513514net.nodes.add_col(ColConf('coords', (0.0, 0.0),515groupnames=['state'],516perm='rw',517is_save=True,518is_plugin=True,519name='Coords',520info='Coordinates',521))522523net.nodes.add_rows(4,524# 1 2 3 4525coords=[(0.0, 0.0), (1.0, 0.0), (1.0, 1.0), (0.0, 1.0)],526)527528net.edges.add_rows(2)529net.edges.ids_node_from[[1, 2]] = [1, 4]530net.edges.ids_node_to[[1, 2]] = [3, 2]531net.get_attrsman().print_attrs()532net.edges.print_attrs()533net.nodes.print_attrs()534save_obj(net, 'test_net.obj')535del net536print '\nreload'+60*'.'537net_new = load_obj('test_net.obj')538net_new.get_attrsman().print_attrs()539net_new.edges.print_attrs()540net_new.nodes.print_attrs()541542543if 0 | is_all:544tab1 = TableObjman('simple_table')545546tab1.add_col(ColConf('surname', 'xx',547groupnames=['state'],548perm='rw',549is_save=True,550name='Family name',551info='Name of Family',552))553554tab1.add_col(ColConf('streetname', 'via della...',555groupnames=['state'],556perm='rw',557is_save=True,558name='Street name',559info='Name of the street',560))561tab1.add_rows(4,562surname=['walt', 'greg', 'bob', 'duck'],563streetname=['a', 'bb', 'ccc', 'dddd'],564)565566print 'direct access: tab1.surname.value', tab1.surname.value567print 'direct access: tab1.streetname.value', tab1.streetname.value568tab1.print_attrs()569570save_obj(tab1, 'test_tab.obj')571del tab1572print '\nreload'+60*'.'573tab1_new = load_obj('test_tab.obj')574tab1_new.print_attrs()575print 'direct access: tab1_new.surname.value', tab1_new.surname.value576print 'direct access: tab1_new.streetname.value', tab1_new.streetname.value577if 0 | is_all:578tab1 = TableObjman('tab1')579print '\ntab1.ident', tab1.ident580581tab2 = TableObjman('tab2', parent=tab1)582print '\ntab2.ident', tab2.ident583584# TODO: seperate attrname from linked obj ident because restrictive and makes problems with multiple tab destinations585# this should be possible ...following the path of attrnames of absident586# -587tab1.add_col(IdsConf(tab2))588589tab2.add_col(IdsConf(tab1, is_child=False))590591tab2.add_col(ColConf('surname', 'xx',592groupnames=['state'],593perm='rw',594is_save=True,595name='Family name',596info='Name of Family',597))598599tab2.add_col(ColConf('streetname', 'via della...',600groupnames=['state'],601perm='rw',602is_save=False,603name='Street name',604info='Name of the street',605))606tab2.add_rows(4,607surname=['walt', 'greg', 'bob', 'duck'],608streetname=['a', 'bb', 'ccc', 'dddd'],609tab1=[2, 1, 3, 1, ],610)611612tab2.print_attrs()613614tab1.add_rows(3,615tab2=[3, 1, 2],616)617618tab1.print_attrs()619620save_obj(tab1, 'test_tab.obj')621del tab1622print '\nreload'+60*'.'623tab1_new = load_obj('test_tab.obj')624625tab1_new.print_attrs()626tab2_new = tab1_new.tab2.get_valueobj()627tab2_new.print_attrs()628print tab2_new.get_ident_abs()629630631if False | is_all: # False:#True:632obj = TestTabman()633634print 'obj.ident', obj.ident635636obj.attrsman.print_attrs()637save_obj(obj, 'test_obj.obj')638del obj639print '\nreload'+60*'.'640obj_new = load_obj('test_obj.obj')641obj_new.attrsman.print_attrs()642# streetname643# print 'This is the value of the attribute: obj.streetname=',obj.streetname644# print 'This is the configuration instance of the attribute x',obj.attrsman.x645#646647if 0 | is_all: # False:#True: ###!!!!!!!!!!!!!!!!check this : failed to reload!!648obj = TestTableObjMan()649650print 'obj.ident', obj.ident651652obj.x.set(1.0/3)653# obj.is_pos_ok.set(True)654655obj.print_attrs()656save_obj(obj, 'test_obj.obj')657del obj658print '\nreload'+60*'.'659obj_new = load_obj('test_obj.obj')660obj_new.x.set(2.0/3)661obj_new.print_attrs()662663# streetname664# print 'This is the value of the attribute: obj.streetname=',obj.streetname665# print 'This is the configuration instance of the attribute x',obj.attrsman.x666#667668if 0 | is_all:669print 'TestTableObjMan export'670obj = TestTableObjMan()671obj.get_attrsman().print_attrs()672xm.write_obj_to_xml(obj, 'test_obj.xml')673del obj674print '\nreload'+60*'.'675obj_new = load_obj('test_obj.obj')676obj_new.get_attrsman().print_attrs()677# sys.exit()678679if 0 | is_all:680obj2 = TestClass2()681682obj2.child1.get_attrsman().x.set(1.99)683684#obj3 = TestClass3(ident = 'testobj3', parent=obj2, name = 'Test Object3')685obj2.get_attrsman().print_attrs()686obj2.child1.get_attrsman().print_attrs()687obj2.child3.get_attrsman().print_attrs()688save_obj(obj2, 'test_obj2.obj')689xm.write_obj_to_xml(obj2, 'test_obj2.xml')690del obj2691print '\nreload'+60*'.'692obj2_new = load_obj('test_obj2.obj')693obj2_new.get_attrsman().print_attrs()694695obj2_new.child1.get_attrsman().print_attrs()696obj2_new.child3.get_attrsman().print_attrs()697# sys.exit()698699if 0 | is_all: # False:#True:700obj = TestClass()701print 'obj.ident', obj.ident702703print 'This is the value of the attribute: obj.x=', obj.x704# print 'This is the configuration instance of the attribute x',obj.attrsman.x705obj.get_attrsman().print_attrs()706# obj.get_attrsman().x.plugin.add_event(EVTSET,on_event_setattr)707# obj.get_attrsman().x.add_event(EVTGET,on_event_getattr)708# print 'obj.get_attrsman().get_groups()',obj.attrsman.get_groups()709# print 'obj.tab.get_groups()',obj.tab.get_groups()710711# print 'Test func...',obj.attrsman.testfunc.get()712# obj.get_attrsman().testfunc.add_event(EVTGET,on_event_getattr)713# obj.get_attrsman().testfunc.get()714print 'obj.get_attrsman().x.get()', obj.get_attrsman().x.get(), 'is_modified', obj.is_modified()715obj.get_attrsman().x.set(1.0)716print 'obj.get_attrsman().x.get()', obj.get_attrsman().x.get(), 'is_modified', obj.is_modified()717718# obj.attrsman.delete('x')719obj.get_attrsman().print_attrs()720save_obj(obj, 'test_obj.obj')721xm.write_obj_to_xml(obj, 'test_obj.xml')722del obj723print '\nreload'+60*'.'724obj_new = load_obj('test_obj.obj')725obj_new.get_attrsman().print_attrs()726# print 'obj.get_attrsman().x.get_formatted()=',obj.get_attrsman().x.get_formatted()727# print 'obj.x',obj.x728729if 1 | is_all:730save_obj(drawing, 'test_drawing.obj')731print '\nreload'+60*'.'732obj_new = load_obj('test_drawing.obj')733obj_new.get_attrsman().print_attrs()734735obj_new.collections.print_attrs()736737tab_check, ids_check = obj_new.collections.tab_id_lists[1][1]738print ' check tab, ids=', tab_check, ids_check739tab_check.print_attrs()740741742