From 1183b468bd91da9b56853cf9f13342343cd28c72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Luis=20Cerc=C3=B3s=20pita?= Date: Mon, 14 May 2012 14:06:07 +0200 Subject: [PATCH] Added tool to setup ship weights (structural based) --- src/Mod/Ship/CMakeLists.txt | 18 +- src/Mod/Ship/Icons/Weight.png | Bin 0 -> 7327 bytes src/Mod/Ship/Icons/Weight.xcf | Bin 0 -> 32353 bytes src/Mod/Ship/Icons/Weight.xpm | 721 +++++++++++++++++++++++++ src/Mod/Ship/InitGui.py | 4 +- src/Mod/Ship/Instance.py | 41 +- src/Mod/Ship/Makefile.am | 6 + src/Mod/Ship/ShipGui.py | 13 + src/Mod/Ship/shipHydrostatics/Tools.py | 2 +- src/Mod/Ship/tankWeights/TaskPanel.py | 212 ++++++++ src/Mod/Ship/tankWeights/TaskPanel.ui | 97 ++++ src/Mod/Ship/tankWeights/__init__.py | 36 ++ 12 files changed, 1145 insertions(+), 5 deletions(-) create mode 100644 src/Mod/Ship/Icons/Weight.png create mode 100644 src/Mod/Ship/Icons/Weight.xcf create mode 100644 src/Mod/Ship/Icons/Weight.xpm create mode 100644 src/Mod/Ship/tankWeights/TaskPanel.py create mode 100644 src/Mod/Ship/tankWeights/TaskPanel.ui create mode 100644 src/Mod/Ship/tankWeights/__init__.py diff --git a/src/Mod/Ship/CMakeLists.txt b/src/Mod/Ship/CMakeLists.txt index a362a0c6a..a3c14ce96 100644 --- a/src/Mod/Ship/CMakeLists.txt +++ b/src/Mod/Ship/CMakeLists.txt @@ -33,6 +33,9 @@ SET(ShipIcons_SRCS Icons/ReparametrizeIco.xpm Icons/Ship.xcf Icons/Ship.xpm + Icons/Weight.png + Icons/Weight.xcf + Icons/Weight.xpm Icons/Tank.png Icons/Tank.xcf Icons/Tank.xpm @@ -96,6 +99,13 @@ SET(ShipUtils_SRCS ) SOURCE_GROUP("shiputils" FILES ${ShipUtils_SRCS}) +SET(ShipWeights_SRCS + tankWeights/__init__.py + tankWeights/TaskPanel.py + tankWeights/TaskPanel.ui +) +SOURCE_GROUP("shipweights" FILES ${ShipWeights_SRCS}) + SET(ShipCreateTank_SRCS tankCreateTank/__init__.py tankCreateTank/TaskPanel.py @@ -103,7 +113,7 @@ SET(ShipCreateTank_SRCS ) SOURCE_GROUP("shipcreatetank" FILES ${ShipCreateTank_SRCS}) -SET(all_files ${ShipMain_SRCS} ${ShipIcons_SRCS} ${ShipExamples_SRCS} ${ShipLoadExample_SRCS} ${ShipCreateShip_SRCS} ${ShipOutlineDraw_SRCS} ${ShipAreasCurve_SRCS} ${ShipHydrostatics_SRCS} ${ShipUtils_SRCS} ${ShipCreateTank_SRCS}) +SET(all_files ${ShipMain_SRCS} ${ShipIcons_SRCS} ${ShipExamples_SRCS} ${ShipLoadExample_SRCS} ${ShipCreateShip_SRCS} ${ShipOutlineDraw_SRCS} ${ShipAreasCurve_SRCS} ${ShipHydrostatics_SRCS} ${ShipUtils_SRCS} ${ShipWeights_SRCS} ${ShipCreateTank_SRCS}) ADD_CUSTOM_TARGET(Ship ALL SOURCES ${all_files} @@ -159,6 +169,12 @@ INSTALL( DESTINATION Mod/Ship/shipUtils ) +INSTALL( + FILES + ${ShipWeights_SRCS} + DESTINATION + Mod/Ship/tankWeights +) INSTALL( FILES ${ShipCreateTank_SRCS} diff --git a/src/Mod/Ship/Icons/Weight.png b/src/Mod/Ship/Icons/Weight.png new file mode 100644 index 0000000000000000000000000000000000000000..b613fa569e1ba8860e75b14b7ae9f17fcd46dd34 GIT binary patch literal 7327 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 z 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 JLcuER{{W=4{qg_+ literal 0 HcmV?d00001 diff --git a/src/Mod/Ship/Icons/Weight.xcf b/src/Mod/Ship/Icons/Weight.xcf new file mode 100644 index 0000000000000000000000000000000000000000..e10ea8e991301b56e4a9a30104fe9db7056c8776 GIT binary patch literal 32353 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 c #767576", +", c #90908F", +"' c #A1A2A2", +") c #ACACAC", +"! c #A1A1A1", +"~ c #8F8E8F", +"{ c #777776", +"] c #636363", +"^ c #636364", +"/ c #636263", +"( c #636362", +"_ c #767676", +": c #9D9D9D", +"< c #B0B0B1", +"[ c #B1B1B0", +"} c #B0B0B0", +"| c #AFAFAF", +"1 c #9C9C9C", +"2 c #767777", +"3 c #656565", +"4 c #646463", +"5 c #868787", +"6 c #AFAFB0", +"7 c #AEAEAE", +"8 c #ADAEAE", +"9 c #ADADAE", +"0 c #868687", +"a c #666667", +"b c #676766", +"c c #656665", +"d c #7B7B7C", +"e c #AFAEAE", +"f c #ACADAC", +"g c #ACACAB", +"h c #7C7C7C", +"i c #686867", +"j c #686868", +"k c #666767", +"l c #A0A0A0", +"m c #ADADAD", +"n c #ADADAC", +"o c #ABAAAA", +"p c #ABABAA", +"q c #9E9E9E", +"r c #6A6969", +"s c #696969", +"t c #676768", +"u c #676868", +"v c #7F7F7F", +"w c #ABABAC", +"x c #A9A9A9", +"y c #A8A8A9", +"z c #80807F", +"A c #6B6B6B", +"B c #6B6C6B", +"C c #696A69", +"D c #939394", +"E c #AAAAAA", +"F c #A7A8A8", +"G c #A8A7A8", +"H c #929292", +"I c #6D6C6D", +"J c #6D6D6D", +"K c #6A6A6A", +"L c #A6A6A6", +"M c #9D9E9E", +"N c #6D6E6E", +"O c #6E6E6D", +"P c #6C6C6C", +"Q c #A0A09F", +"R c #A8A7A7", +"S c #A4A4A5", +"T c #706F6F", +"U c #706F70", +"V c #6D6E6D", +"W c #A6A5A6", +"X c #A3A3A3", +"Y c #919191", +"Z c #717070", +"` c #707171", +" . c #6F6F6F", +".. c #6F6F6E", +"+. c #818281", +"@. c #A4A4A4", +"#. c #A2A2A2", +"$. c #A2A2A1", +"%. c #727272", +"&. c #707071", +"*. c #717071", +"=. c #9A9A9A", +"-. c #A2A2A3", +";. c #A0A1A0", +">. c #989897", +",. c #737473", +"'. c #737474", +"). c #727172", +"!. c #808080", +"~. c #9F9F9F", +"{. c #9E9F9F", +"]. c #808181", +"^. c #747574", +"/. c #757575", +"(. c #737373", +"_. c #737374", +":. c #888888", +"<. c #A09FA0", +"[. c #9F9FA0", +"}. c #A09F9F", +"|. c #878888", +"1. c #767675", +"2. c #949494", +"3. c #9D9D9E", +"4. c #9D9C9C", +"5. c #9C9C9D", +"6. c #787778", +"7. c #777778", +"8. c #777777", +"9. c #8C8C8C", +"0. c #999A99", +"a. c #818181", +"b. c #797878", +"c. c #797879", +"d. c #605F60", +"e. c #605F5F", +"f. c #606160", +"g. c #616061", +"h. c #626162", +"i. c #616262", +"j. c #636262", +"k. c #626363", +"l. c #636463", +"m. c #646464", +"n. c #646564", +"o. c #646465", +"p. c #656564", +"q. c #656666", +"r. c #666666", +"s. c #666565", +"t. c #676666", +"u. c #676767", +"v. c #686768", +"w. c #686767", +"x. c #696869", +"y. c #5F5F60", +"z. c #616060", +"A. c #626161", +"B. c #626263", +"C. c #636464", +"D. c #656464", +"E. c #656566", +"F. c #696868", +"G. c #6A6A69", +"H. c #69696A", +"I. c #B3B3B3", +"J. c #B3B2B2", +"K. c #B2B2B2", +"L. c #B2B2B1", +"M. c #B2B1B1", +"N. c #B1B1B1", +"O. c #B0B1B1", +"P. c #AFB0AF", +"Q. c #AEAFAF", +"R. c #ACADAD", +"S. c #ABABAB", +"T. c #AAABAA", +"U. c #AAA9AA", +"V. c #6B6B6A", +"W. c #6B6C6C", +"X. c #6C6B6C", +"Y. c #B2B3B3", +"Z. c #B2B3B2", +"`. c #B2B1B2", +" + c #B1B2B1", +".+ c #B1B1B2", +"++ c #B1B0B0", +"@+ c #B0AFB0", +"#+ c #AFAEAF", +"$+ c #AEADAE", +"%+ c #ADACAC", +"&+ c #ACACAD", +"*+ c #ABACAC", +"=+ c #ACABAB", +"-+ c #AAAAAB", +";+ c #A9A9AA", +">+ c #A8A8A8", +",+ c #6D6C6C", +"'+ c #6C6D6D", +")+ c #B1B2B2", +"!+ c #B0B1B0", +"~+ c #AFB0B0", +"{+ c #AEAFAE", +"]+ c #AFAFAE", +"^+ c #AEADAD", +"/+ c #ACABAC", +"(+ c #A9AAAA", +"_+ c #A9A8A9", +":+ c #A7A7A7", +"<+ c #A6A7A6", +"[+ c #6E6E6E", +"}+ c #B1B0B1", +"|+ c #ADAEAD", +"1+ c #ADACAD", +"2+ c #A9A8A8", +"3+ c #A7A8A7", +"4+ c #A7A6A7", +"5+ c #A5A5A6", +"6+ c #A6A6A5", +"7+ c #A6A5A5", +"8+ c #A5A5A5", +"9+ c #6F6F70", +"0+ c #5F605F", +"a+ c #B3B2B3", +"b+ c #AAABAB", +"c+ c #A9AAA9", +"d+ c #A4A5A5", +"e+ c #A3A4A4", +"f+ c #A4A3A3", +"g+ c #A3A3A4", +"h+ c #B0AFAF", +"i+ c #AEAEAF", +"j+ c #A8A9A8", +"k+ c #A7A7A8", +"l+ c #A7A7A6", +"m+ c #A7A6A6", +"n+ c #A5A4A4", +"o+ c #A4A3A4", +"p+ c #A3A4A3", +"q+ c #A3A3A2", +"r+ c #B2B2B3", +"s+ c #AAAAA9", +"t+ c #A6A6A7", +"u+ c #A5A6A6", +"v+ c #A5A6A5", +"w+ c #A4A5A4", +"x+ c #A4A4A3", +"y+ c #A1A2A1", +"z+ c #A1A1A0", +"A+ c #737273", +"B+ c #747374", +"C+ c #AEAEAD", +"D+ c #A6A7A7", +"E+ c #A2A3A2", +"F+ c #A2A1A2", +"G+ c #A0A1A1", +"H+ c #A1A0A1", +"I+ c #A0A0A1", +"J+ c #747474", +"K+ c #B0B0AF", +"L+ c #ABACAB", +"M+ c #ABAAAB", +"N+ c #A5A4A5", +"O+ c #A3A2A3", +"P+ c #A2A1A1", +"Q+ c #9FA09F", +"R+ c #9E9F9E", +"S+ c #757676", +"T+ c #AAA9A9", +"U+ c #A5A5A4", +"V+ c #A2A3A3", +"W+ c #A1A1A2", +"X+ c #9F9E9E", +"Y+ c #9E9D9D", +"Z+ c #9C9D9D", +"`+ c #9D9D9C", +" @ c #777877", +".@ c #A8A8A7", +"+@ c #9FA0A0", +"@@ c #9F9E9F", +"#@ c #9D9E9D", +"$@ c #9C9D9C", +"%@ c #9B9C9C", +"&@ c #787879", +"*@ c #676867", +"=@ c #A9A9A8", +"-@ c #9E9E9D", +";@ c #9C9C9B", +">@ c #9B9B9B", +",@ c #9B9B9A", +"'@ c #9A9B9B", +")@ c #797A79", +"!@ c #797A7A", +"~@ c #7A797A", +"{@ c #686969", +"]@ c #9D9C9D", +"^@ c #9A9B9A", +"/@ c #999A9A", +"(@ c #999999", +"_@ c #999899", +":@ c #7A7B7B", +"<@ c #7B7B7B", +"[@ c #A3A2A2", +"}@ c #A1A0A0", +"|@ c #9E9E9F", +"1@ c #9C9B9C", +"2@ c #9C9B9B", +"3@ c #9A9A99", +"4@ c #9A999A", +"5@ c #989998", +"6@ c #989898", +"7@ c #979898", +"8@ c #989797", +"9@ c #979797", +"0@ c #7C7C7D", +"a@ c #6B6A6A", +"b@ c #6B6A6B", +"c@ c #000000", +"d@ c #9F9F9E", +"e@ c #9B9A9A", +"f@ c #9A9999", +"g@ c #989899", +"h@ c #969796", +"i@ c #969696", +"j@ c #7D7E7D", +"k@ c #7E7E7E", +"l@ c #9B9B9C", +"m@ c #999898", +"n@ c #979897", +"o@ c #969697", +"p@ c #969595", +"q@ c #959596", +"r@ c #959595", +"s@ c #959594", +"t@ c #959495", +"u@ c #7E7F7F", +"v@ c #6C6D6C", +"w@ c #9E9D9E", +"x@ c #979798", +"y@ c #969596", +"z@ c #969695", +"A@ c #949594", +"B@ c #939494", +"C@ c #949493", +"D@ c #939493", +"E@ c #807F80", +"F@ c #9B9C9B", +"G@ c #969797", +"H@ c #959696", +"I@ c #959494", +"J@ c #949394", +"K@ c #939393", +"L@ c #939293", +"M@ c #929392", +"N@ c #939292", +"O@ c #818282", +"P@ c #6E6F6F", +"Q@ c #989999", +"R@ c #979696", +"S@ c #939392", +"T@ c #929393", +"U@ c #919291", +"V@ c #919190", +"W@ c #828283", +"X@ c #828382", +"Y@ c #707070", +"Z@ c #9B9A9B", +"`@ c #9A9A9B", +" # c #949595", +".# c #929291", +"+# c #929191", +"@# c #919091", +"## c #909090", +"$# c #908F90", +"%# c #8F8F90", +"&# c #848383", +"*# c #838384", +"=# c #848484", +"-# c #717171", +";# c #999998", +"># c #979697", +",# c #909190", +"'# c #919090", +")# c #8F8F8F", +"!# c #8E8E8E", +"~# c #8E8F8E", +"{# c #858484", +"]# c #858585", +"^# c #727372", +"/# c #99999A", +"(# c #959695", +"_# c #949495", +":# c #949393", +"<# c #919292", +"[# c #908F8F", +"}# c #8F8F8E", +"|# c #8F8E8E", +"1# c #8E8F8F", +"2# c #8E8D8E", +"3# c #8E8D8D", +"4# c #8D8E8D", +"5# c #8D8C8D", +"6# c #8D8D8D", +"7# c #868686", +"8# c #747473", +"9# c #929192", +"0# c #909091", +"a# c #8D8E8E", +"b# c #8D8D8E", +"c# c #8C8D8D", +"d# c #8B8C8B", +"e# c #878787", +"f# c #878887", +"g# c #747475", +"h# c #747575", +"i# c #979796", +"j# c #8E8E8F", +"k# c #8E8E8D", +"l# c #8D8D8C", +"m# c #8B8C8C", +"n# c #8B8B8B", +"o# c #8A8B8B", +"p# c #8B8A8A", +"q# c #8A8A8A", +"r# c #888988", +"s# c #898989", +"t# c #8F9090", +"u# c #8D8C8C", +"v# c #8C8B8C", +"w# c #8B8B8A", +"x# c #8C8C8B", +"y# c #8A8A8B", +"z# c #89898A", +"A# c #898A89", +"B# c #8A8989", +"C# c #888788", +"D# c #8C8B8B", +"E# c #777878", +"F# c #8B8A8B", +"G# c #8A8B8A", +"H# c #8A898A", +"I# c #8A8A89", +"J# c #888989", +"K# c #898888", +"L# c #888887", +"M# c #868786", +"N# c #797978", +"O# c #797979", +"P# c #929293", +"Q# c #878788", +"R# c #878687", +"S# c #868586", +"T# c #858485", +"U# c #7A7A7A", +"V# c #898A8A", +"W# c #898889", +"X# c #888889", +"Y# c #888787", +"Z# c #878786", +"`# c #868685", +" $ c #858685", +".$ c #838483", +"+$ c #8F908F", +"@$ c #7B7C7C", +"#$ c #8C8C8D", +"$$ c #898988", +"%$ c #878686", +"&$ c #868585", +"*$ c #848585", +"=$ c #858584", +"-$ c #838383", +";$ c #828282", +">$ c #838282", +",$ c #7D7C7C", +"'$ c #858586", +")$ c #838484", +"!$ c #838382", +"~$ c #818182", +"{$ c #828181", +"]$ c #808180", +"^$ c #919192", +"/$ c #7E7D7D", +"($ c #8C8D8C", +"_$ c #838283", +":$ c #828383", +"<$ c #828281", +"[$ c #818180", +"}$ c #7F807F", +"|$ c #7E7E7F", +"1$ c #7E7F7E", +"2$ c #7F7E7F", +"3$ c #858686", +"4$ c #848384", +"5$ c #818081", +"6$ c #818080", +"7$ c #807F7F", +"8$ c #7F7F7E", +"9$ c #7F7F80", +"0$ c #909191", +"a$ c #8B8B8C", +"b$ c #848584", +"c$ c #848483", +"d$ c #7E7E7D", +"e$ c #7E7D7E", +"f$ c #7D7D7D", +"g$ c #828182", +"h$ c #7F8080", +"i$ c #7D7C7D", +"j$ c #7C7D7D", +"k$ c #7C7D7C", +"l$ c #7C7C7B", +"m$ c #7B7C7B", +"n$ c #7D7E7E", +"o$ c #7D7D7E", +"p$ c #7D7D7C", +"q$ c #7C7B7C", +"r$ c #7B7B7A", +"s$ c #7A7B7A", +"t$ c #7A7A7B", +"u$ c #7A7A79", +"v$ c #787979", +"w$ c #848485", +"x$ c #7F7E7E", +"y$ c #7C7B7B", +"z$ c #7A7979", +"A$ c #787878", +"B$ c #787777", +"C$ c #787877", +"D$ c #808081", +"E$ c #787978", +"F$ c #777677", +"G$ c #767776", +"H$ c #7B7A7A", +"I$ c #767677", +"J$ c #757576", +"K$ c #757475", +"L$ c #747373", +"M$ c #727373", +"N$ c #737372", +"O$ c #737272", +"P$ c #7B7A7B", +"Q$ c #757675", +"R$ c #757574", +"S$ c #717272", +"T$ c #717172", +"U$ c #777676", +"V$ c #70706F", +"W$ c #79797A", +"X$ c #757474", +"Y$ c #727271", +"Z$ c #727171", +"`$ c #6F6E6F", +" % c #767575", +".% c #6F6E6E", +"+% c #6E6F6E", +"@% c #6E6D6D", +"#% c #6D6D6E", +"$% c #6D6D6C", +"%% c #717271", +"&% c #6C6C6D", +"*% c #6B6B6C", +"=% c #717170", +"-% c #6F706F", +";% c #6E6D6E", +">% c #6C6C6B", +",% c #6A6B6B", +"'% c #6A6B6A", +")% c #707170", +"!% c #6F7070", +"~% c #6A6A6B", +"{% c #6E6E6F", +"]% c #696A6A", +"^% c #696968", +"/% c #686968", +"(% c #666766", +"_% c #6C6B6B", +":% c #676667", +"<% c #6A696A", +"[% c #656465", +"}% c #666566", +"|% c #666665", +"1% c #646565", +"2% c #646364", +"3% c #646363", +"4% c #989798", +"5% c #686869", +"6% c #626362", +"7% c #606061", +"8% c #B3B3B2", +"9% c #A8A9A9", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" . . + @ + # + ", +" + + $ + % & & & * * = ", +" - - ; > , ' ) ! ~ { ] ] ^ ", +" / ( _ : < [ < } } | | 1 2 3 3 ", +" 4 4 5 } 6 | | 7 7 8 9 0 a b ", +" 3 c d e 7 7 f ) g h i j ", +" k k l m n o p q r s ", +" t u v ) w x y z A B ", +" C s D o E F G H I J ", +" K A l x L M N O ", +" P P Q R S 1 T U ", +" V V H L W X X Y Z ` ", +" ...+.@.S #.$.+.%.%. ", +" &.*.=.-.X ;.l >.,.'. ", +" ).%.!.! ! ! ~.~.{.].^./. ", +" (._.:.<.[.}.~. q q q M |.1._ ", +" /./.v 2.q M 3.: : 4.5.H !.6.7. ", +" 2 { 8.!.9.2.0.2.9.a.b.b.c. ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . d.. e.@ f.f.g.& & h.& = i.j.j.j.k.] ] l.4 m.n.o.p.3 3 q.r.s.r.r.t.t.u.u.j v.w.j j x. ", +" . . . . . . . . . . . . . . . . . . . . . . . @ d.y.+ z.z.f.$ & A.A.= * * j.B.] ] C.m.4 m.m.D.p.p.3 E.E.r.r.t.r.u.u.u.u t i j j x.F.s s G.H.K K ", +" . . . . I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.J.K.K.K.L.M.N.O.} } } } } P.| | Q.7 7 8 m m 9 m f R.) ) ) S.S.S.S.T.E E U.E x V.A W.X. ", +" . . . I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.Y.Z.K.`. +M..+N.++N.++} @+| | | | e #+7 $+$+m m %+&+) ) ) *+=+g S.o E -+;+E ;+x x x >+>+>+F G ,+'+J ", +" . . I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.J.I.K.K.K.K.)+M.[ ++!+} ~+} ~+| | {+]+{+$+7 $+^+m n n %+) /+w S.S.S.o E E E U.(+x x x _+>+>+>+:+R :+:+<+:+L O [+ ", +" . . . I.I.I.I.I.I.I.I.I.I.I.I.I.I.J.Z.K.K..+`.N.N.}+++} ~+} 6 | | | e 7 7 7 m |+m &+1+f ) *+*+w S.T.-+o E E E (+x x 2+2+>+>+3+F R :+4+L L L 5+6+7+8+@. .9+T ", +" 0+@ I.I.I.I.I.I.I.I.I.Y.a+Z.K.K.L.N.N.[ !+} } } ~+} 6 | {+7 7 7 $+m ^+m ) ) 1+) g /+S.S.S.b+E E E (+c+x x y >+>+>+F F :+:+:+L L L W W 5+8+S d+@.@.e+f+g+Z &. ", +" & $ I.I.I.I.I.I.J.K.K. +L.N.N.!+} } h+| | 6 | | {+i+7 7 8 m R.R.) ) ) ) *+w S.b+b+E E E (+x x _+j+y >+G G 3+k+:+l+m+m+L 7+5+5+d+8+n+@.o+o+p+X q+X #.#.#.).%. ", +" & * * r+K.L.)+.+N.N.++N.!+} } h+@+| | | 7 7 7 9 m m 1+&+&+f ) ) w S.S.o E T.s+s+x (+x 2+j+y >+F k+:+:+4+t+t+L u+u+v+v+8+8+w+@.x+o+@.X X q+-.-.#.' y+! ! z+A+(.B+ ", +" ] / +.+N.N.} !+} @+@+P.| | ]+i+7 |+C+m m m &+f f g *+=+S.S.S.o E E U.s+(+x x j+2+>+F k+k+:+D+m+L L 6+8+7+8+8+8+n+@.@.o+x+f+X -.E+#.' F+' ! ! ;.G+H+I+}.}.<.J+/. ", +" 4 m.m.!+K+@+~+h+| #+7 {+7 C+^+8 m m &+&+) g L+S.S.S.p M+E U.s+x x x x 2+2+>+R F k+:+<+l+L L L W 8+v+N+w+@.S x+x+X X q+X O+E+F+P+F+! ! H+I+;.Q l Q+~.~.{.~.R+q S+_ _ ", +" 3 3 h+| | {+e 7 ^+^+^+m m ) ) ) ) =+w S.S.b+-+T.U.c+T+;+x x 2+2+>+>+R :+:+D+L L L L 6+7+8+N+U+w+@.e+x+o+p+V+X #.E+' y+W+! H+l l l l [.[.~.{.~.q X+q 3.Y+: : Z+`+8. @ ", +" r.r.7 m 7 ^+m n R.) ) L+*+=+L+S.-+b+E E (+T+x x x >+j+>+.@G :+l+:+D+L L u+7+5+8+N+8+@.@.f+X f+f+q+X #.#.y+' $.! ! ;.I+l Q +@Q+}.@@~.q q q #@3.: : : $@$@1 1 %@%@&@c. ", +" u.w.*@m &+&+) /+w S.S.S.S.o o E x c+T+x y =@>+>+R G :+:+:+m+:+6+7+6+8+8+8+n+S @.e+@.x+X q+#.#.E+#.y+! ! ! z+I+l l +@l }.~.~.R+R+q -@#@: : `+5.1 1 ;@>@>@>@>@,@'@=.)@!@~@ ", +" j {@g S.S.S.S.E p E c+T+U.x x 2+_+>+>+F R R t+:+m+L L 5+v+8+8+8+N+w+@.@.f+p+f+X X #.#.#.! ! ! ! I+z+l l [.~.~.~.{.X+q q M M : : ]@5.1 1 %@;@>@>@>@>@^@=./@(@(@0.(@_@:@<@ ", +" H.s r M+T.E E T+;+x =@x y >+>+G F :+:+D+L L L L 7+8+8+n+U+@.@.p+p+X X O+V+#.[@#.$.P+! ! }@G+l <.Q [.[.~.@@|@q q M #@: : : 4.1 1 1@2@>@>@>@=.=.=.3@4@3@(@(@_@5@6@7@8@9@h h 0@ ", +" a@b@T+;+x =@y >+>+>+3+G :+:+l+c@c@c@c@c@c@d+8+N+@.@.@.X o+X X q+#.#.P+P+W+! ! G+H+l +@+@<.~.~.d@R+q q 3.M 3.: ]@Z+5.1@2@1 >@>@=.=.e@=.=.f@(@(@(@g@6@6@6@6@9@8@h@9@i@i@i@j@k@ ", +" P W.j+>+G R 3+:+:+t+:+L L 7+7+c@c@c@c@c@c@@.@.X X O+X #.' #.F+P+! G+H+l l l ~.Q ~.~.X+q R+-@M M #@Z+]@4.1 1 ;@2@l@>@e@^@^@=.4@=.0.(@(@5@m@6@>.8@n@9@9@i@o@i@p@q@p@r@s@t@v u@ ", +" J J v@:+:+:+l+L 5+6+5+8+d+d+@.@.c@c@c@c@c@c@#.#.#.#.' P+! ! ! I+l Q ~.~.~.d@q X+q q w@3.: : 5.1 4.1 %@2@>@>@>@e@=.=.3@4@0._@_@5@5@6@6@x@9@8@9@9@i@i@i@y@z@r@r@t@A@2.B@C@D@!.E@!. ", +" O [+L L v+8+8+8+8+S @.e+x+x+X X c@c@c@c@c@c@! H+! }@}@l l l [.~.{.d@q q M w@Y+: : ]@1 $@1 1 %@F@>@'@'@=.=.4@=.(@(@g@(@6@6@7@9@n@9@9@o@G@i@z@H@y@r@r@I@r@2.2.2.J@K@K@L@M@N@H a.O@ ", +" P@T N+w+n+@.@.g+X X V+O+V+[@#.y+c@c@c@c@c@c@l Q Q+~.~.~.{.{.q q q : : `+: `+1 ;@2@F@l@>@,@^@=.=./@/@(@Q@Q@m@5@6@x@x@x@9@9@i@R@i@z@r@q@r@r@t@A@A@D 2.K@D@K@S@T@H H U@H Y Y V@W@X@ ", +" Y@Y@Y@p+g+X [@X #.-.#.F+W+! ! ! ! c@c@c@c@c@c@|@q q q M 3.: : ]@]@5.1 1 1 >@>@^@Z@=.`@=.f@f@(@Q@m@6@Q@6@x@9@8@9@9@o@R@i@i@y@q@r@ #I@I@2.J@B@K@K@S@N@M@H .#+#.#Y Y V@@#####$#%#&#*#=# ", +" -#-#-.O+#.' ! P+W+z+}@I+}@l l Q [.c@c@c@c@c@c@Y+: ]@Z+: 1 1 %@>@>@>@>@'@=.=./@3@(@(@;#6@6@6@6@7@9@n@>#9@i@R@i@i@q@r@r@ #s@2.2.J@D D@K@S@K@H N@H +#Y Y Y ,#'#####, $#)#)#)#!#~#!#{#]# ", +" %.^#! ! ! }@z+}@l +@+@~.~.X+{.R+q c@c@c@c@c@c@1 1 ;@;@F@>@=.e@'@=./#3@f@(@Q@_@5@m@>.>.n@9@G@R@>#o@i@(#z@H@r@t@2._#2.:#B@D K@N@T@H H .#<#Y Y Y Y ######$#[#)#}#|#1#|#!#2#3#4#5#6#7#7# ", +" (.(.8#l l l ~.[.d@~.q X+q Y+#@3.: Z+c@c@c@c@c@c@>@>@^@`@=.=./@c@c@c@c@c@c@6@>.8@9@9@h@9@i@i@c@c@c@c@c@c@2.2.2.c@c@c@c@c@c@H U@9#U@Y Y Y 0#####%#)#)#)#)#!#}#a#b#b#6#c#5#c#9.9.9.d#e#f#e# ", +" g#h#~.|@@@|@q -@q #@: : : 4.$@F@%@%@c@c@c@c@c@c@4@4@(@(@Q@Q@c@c@c@c@c@c@i#i#o@i@z@i@H@r@c@c@c@c@c@c@c@c@c@N@M@c@c@c@c@c@c@Y '#'#####%#%#)#)#j#!#!#!#k#!#6#6#5#9.l#9.9.m#d#n#o#o#p#q#r#s# ", +" S+/.S+q q 3.: ]@$@`+4.1 %@l@>@Z@,@e@=.c@c@c@c@c@c@(@m@6@>.8@n@c@c@c@c@c@i@y@q@r@r@s@s@2.c@c@c@c@c@c@c@c@c@c@c@U@c@c@c@c@c@c@t#, )#1#}#|#!#!#2#4#6#6#c#u#9.9.v#n#n#n#w#q#q#q#q#q#s#s#s#q#q#p# ", +" 2 8.`+`+1 1 %@1 F@2@>@>@^@=./@3@4@/@(@c@c@c@c@c@c@9@9@9@>#h@c@c@c@c@c@r@r@t@I@2.B@D@K@K@c@c@c@c@c@c@c@c@c@c@c@c@c@c@c@c@c@c@|#!#!#6#b#6#5#l#9.9.9.x#9.n#n#n#o#y#q#z#A#B#s#s#r#:.:.f#C#f#d#D# ", +" 7.E#%@l@>@>@`@'@e@3@=.4@(@(@5@5@6@6@6@c@c@c@c@c@c@i@i@r@r@c@c@c@c@c@c@K@K@D@K@S@S@L@H c@c@c@c@c@c@c@##$#$#$#c@c@c@c@c@c@c@c@6#6#9.5#9.9.d#D#n#n#F#q#G#q#H#I#A#s#J#K#K#:.C#C#L#e#e#M#7#7#9.9. ", +" N#c.O#e@=.=.=.(@0.(@(@_@5@>.6@7@9@9@9@G@c@c@c@c@c@c@s@r@r@c@c@c@c@c@c@S@S@P#H U@Y Y Y Y c@c@c@c@c@c@)#~ 1#~#!#2#c@c@c@c@c@c@c@x#n#9.n#n#w#G#q#I#H#B#A#s#r#s#:.:.:.Q#L#e#R#R#7#7#S#7#]#]#T#a#!#~# ", +" ~@U#f@f@(@Q@m@g@7@>.x@n@9@i@9@i@H@y@r@y@c@c@c@c@c@c@2.D c@c@c@c@c@c@H U@Y Y V@,#,###, c@c@c@c@c@c@c@a#a#k#6#5#6#c@c@c@c@c@c@c@o#y#q#q#I#s#V#W#s#X#:.:.Y#:.C#e#Z#7#7#`#7# $]#]#T#]#{#=#=#=#.$)#+$ ", +" <@@$6@8@9@x@9@9@o@o@i@i@y@H@r@r@ #I@A@2.c@c@c@c@c@c@M@c@c@c@c@c@c@Y 0#####$#)#)#)#1#~#c@c@c@c@c@c@u#6##$9.9.D#D#d#c@c@c@c@c@c@A#s#$$J#X#r#:.:.f#e#e#%$R#7#7#&$]#`#*$=$=$=#=#=#*#-$-$-$;$W@>$,#Y ", +" h h ,$9@i@i@i@i@y@H@r@r@r@r@_#2.J@:#K@K@N@c@c@c@c@c@c@c@c@c@c@c@c@##$#%#)#1#|#~#!#a#a#6#c@c@c@c@c@c@D#9.n#o#p#q#q#B#c@c@c@c@c@c@:.|.:.L#e#5 Z#R#7#7#'$ $]#]#{#=#=#=#=#)$&#-$-$W@!$X@;$~${$a.]$H H ^$ ", +" j@/$H@y@p@r@r@t@2.2.2.2.J@:#K@K@P#M@H H +#c@c@c@c@c@c@c@c@c@c@c@c@c@!#2#k#b#3#5#c##$($9.c@c@c@c@c@c@o#q#V#z#B#s#s#W#c@c@c@c@c@c@e#e#0 7#`#`#S#]#]#=$T#=#=#)$*#-$-$_$:$;$;$<$O@{$a.]$[$!.!.!.v }$K@:# ", +" |$1$2$s@2.2.C@:#D@K@K@K@H M@H H U@Y Y Y 0###c@c@c@c@c@c@c@c@c@c@c@c@c@c#5##$9.9.m#D#v#n#o#c@c@c@c@c@c@s#J#$$:.:.:.L#Y#c@c@c@c@c@c@`#3$]#]#]#*$]#=#*#4$)$-$!$X@!$;$;$~$a.a.].5$5$6$!.}$7$v 8$v u@2$2.2.r@ ", +" 9$}$:#B@K@K@L@H N@<#H <#<#@#0$0$######, +$)#c@c@c@c@c@c@c@c@c@c@c@c@c@c@a$D#y#p#q#q#q#q#s#c@c@c@c@c@c@C#e#:.e#e#5 %$7#c@c@c@c@c@c@b$=#c$=#-$-$-$W@;$;$;$;$+.a.a.a.[$[$!.!.!.}$v u@2$k@k@k@d$e$f$,$f$r@z@ ", +" a.].L@T@H U@+#U@Y Y Y ######, +$)#)#j#!#!#k#c@c@c@c@c@c@c@c@a$c@c@c@c@c@p#q#I#B#s#s#K#s#K#c@c@c@c@c@c@%$%$7#7#'$'$]#{#c@c@c@c@c@c@-$-$:$!$X@g$~$O@+.a.a.[$!.!.}$E@h$v 2$2$|$k@k@f$/$f$i$j$k$h l$@$m$9@9@ ", +" g$~$<$+#Y @#'#V@t#[#[#%#)#1#|#j#!#k#b#6#4#l#l#c@c@c@c@c@c@n#w#y#c@c@c@c@c@c@W#J#:.:.:.|.e#e#c@c@c@c@c@c@3$]#*$=$=$=#4$*#c@c@c@c@c@c@<$a.+.a.a.[$].!.z E@z v v v |$1$k@n$k@f$o$f$j$p$0@h q$<@<@r$r$s$s$6@6@5@ ", +" >$-$,###+$[#[#)#}#}#!#!#b#b#6#6#6#6##$u#9.x#d#c@c@c@c@c@c@I#B#s#s#c@c@c@c@c@c@Q#5 Z#M#7#7#7#c@c@c@c@c@c@=#c$c$-$-$-$>$X@c@c@c@c@c@c@a.[$!.!.7$h$v 8$8$8$1$k@n$j@/$f$f$j$0@h q$<@l$<@<@t$U#U#~@u$O#O#O#v$f@/@ ", +" c$)$=#)#)#!#~#!#3#a#4#6#5#9.#$9.v#m#n#n#n#w#G#q#c@c@c@c@c@c@$$K#:.C#c@c@c@c@c@c@7#7# $ $]#T#w$c@c@c@c@c@c@c@!$X@;$;$a.<$c@c@c@c@c@c@c@v v v k@x$k@k@k@o$o$f$k$f$i$h l$q$y$<@<@<@t$U#U#u$O#z$c.&@b.A$E#B$C$,@^@,@ ", +" ]#]#!#6#k#3#6#6#l#($9.9.m#n#n#n#F#y#q#I#V#z#s#s#c@c@c@c@c@c@e#e#M#M#7#c@c@c@c@c@c@b$=#=#)$.$-$-$c@c@c@c@c@c@g${$a.!.a.D$c@c@c@c@c@c@c@x$k@d$/$f$f$j$p$h h h c@c@c@c@c@c@U#U#z$~@O#b.E$c.A$A$C$7.8.8.F$G$_ _ 1 1 ", +" 7#7##$9.c#9.x#n#n#n#n#n#p#q#I#H#s#s#s#s#J#:.:.L#c@c@c@c@c@c@3$ $&$]#]#c@c@c@c@c@c@-$-$>$>$;$;$O@c@c@c@c@c@c@c@!.E@9$v c@c@c@c@c@c@c@c@f$f$0@0@h <@l$y$<@t$H$c@c@c@c@c@c@c.O#c.&@A$A$8.B$8.{ I$_ > S+/.J$/.h#: #@ ", +" e#e#Y#v#n#n#o#p#q#q#q#A#z#s#J#K#X#:.:.Q#e#e#e#Z#0 c@c@c@c@c@c@b$*$b$=#=#)$c@c@c@c@c@c@O@;$a.a.]$].6$c@c@c@c@c@c@c@c@c@c@c@c@c@c@c@c@c@c@d <@<@r$:@<@H$U#u$u$U#c@c@c@c@c@c@7.7.8.I$2 I$_ S+S+S+/.g#/./.^.J+'.8#q @@{. ", +" :.:.F#p#q#q#q#A#s#J#s#X#:.:.|.L#Y#5 %$7#7#7# $`#]#c@c@c@c@c@c@c$-$-$-$>$;$;$c@c@c@c@c@c@!.!.!.}$v v c@c@c@c@c@c@c@c@c@c@c@h c@c@c@c@c@c@r$U#U#~@u$O#O#N#E$A$A$c@c@c@c@c@c@2 _ _ 1.J$J$/.K$h#J+J+L$'.(.M$N$%.O$%.l +@ ", +" z#V#z#$$W#X#r#:.:.Q#e#Q#R#Z#%$7#S#'$]#]#]#]#=#{#=#c@c@c@c@c@c@W@;$;$+.a.a.5$c@c@c@c@c@c@v u@1$1$k@k@d$c@c@c@c@c@c@c@c@c@<@P$c@c@c@c@c@c@z$O#v$b.A$A$A$B$B$8.8.c@c@c@c@c@c@Q$K$J+R$J+J+B+L$'.(.(.%.O$%.S$T$-#-#` H+! ", +" p#F#w#:.:.:.Y#e#Z#Z#7#7#7#`#&$]#]#T#b$=#=#c$-$*#-$!$c@c@c@c@c@c@a.].]$]$!.E@}$9$c@c@c@c@c@c@e$f$f$f$f$i$h h c@c@c@c@c@s$U#U#u$c@c@c@c@c@c@A$ @6. @8.{ 2 U$_ _ _ c@c@c@c@c@c@B+J+_.(.A+A+^#%.%.%.%.S$` *.-#Y@Y@U V$#.q+E+ ", +" v#9.e#5 e#7#7#S#3$]#]#]#*$=$b$4$&#-$-$-$:$_$;$;$<$<${$a.].]$!.!.!.z v 8$v 8$x$k@k@d$j@f$f$p$f$h l$m$d <@<@:@U#t$u$W$O#O#O#v$v$c@c@c@c@c@c@{ { G$_ _ _ /./.h#X$^.^.8#(.,.(.(.A+%.%.Y$Z$S$-#-#*.Z Y@Y@U U . .`$`$[+[+e+o+ ", +" c#5#6#7#`#]#]#=$=$w$=#c$=#-$4$-$_$X@;$;${$a.{$a.a.a.6$!.h$7$}$2$2$k@k@k@n$/$f$f$f$k$k$h h q$m$<@P$r$U#U#U#U#u$O#O#c.E$A$E#7. @7.c@c@c@c@c@c@J$ %/./.X$J+J+_.B+(.(.A+M$^#%.%.S$S$-#-#*.&.Z Y@U . ....%+%[+[+@%#%#%J $%U+8+8+ ", +" 2#!#*$b$w$=#.$-$-$-$W@-$;$;$;${${$a.a.!.!.!.h$h$9$v v 2$2$1$e$k@k@j@p$h ,$h h l$h <@<@<@U#s$U#U#W$W$O#c@c@c@c@c@c@8.E#8.2 8._ c@c@c@c@c@c@R$g#J+_.8#,.(.A+M$%.A+%%S$-#-#-#` Y@Y@Y@V$ .9+ .[+`$.%[+[+N J J I &%,+P P P *%<+<+ ", +" ~ )#-$-$-$:$_$>$;$g$g$+.a.a.6$5$!.!.E@7$v v |$|$k@k@k@f$/$f$k$h k$h @$l$<@<@:@<@r$U#~@u$z$)@O#b.A$E$C$c@c@c@c@c@c@c@S+1.S+Q$c@c@c@c@c@c@c@L$(.(.N$%.%.%.Z$).-#-#=%*.Y@Y@U -% . . .[++%O V ;%J J J v@P W.>%A A A ,%'%V.K :+3+ ", +" )###,#;$;$g$a.+.a.a.[$a.!.h$9$E@v 8$v x$x$n$e$/$f$f$i$0@k$h q$q$d <@H$t$U#U#~@U#!@O#v$&@A$b.7.6.7.8.8.F$8.c@c@c@c@c@c@c@c@c@c@c@c@c@c@c@c@O$%.S$Y$-#-#=%` )%Y@!%9+T T ..%P@[+N ;%O J J '+$%I P P B A A a@b@~%K r s s s F.2+=@_+ ", +" Y Y a.a.a.5$!.]$E@z z v u@u@k@x$k@e$f$f$j$f$h 0@h h d <@<@<@H$U#U#U#u$O#O#N#A$E$A$A$C$A$8.8.U$_ _ > > _ /./.c@c@c@c@c@c@c@c@c@c@c@c@c@c@c@-#Z )%&.Y@Y@T !% . .{%+%[+[+N V @%I $%,+&%P W.P A A A ,%K K G.]%s s s x.j j j u w.E E ", +" S@M@!.E@}$v v v 8$1$k@k@k@e$f$f$j$h k$h y$q$<@<@U#r$U#U#u$U#O#v$E$N#b.A$B$ @8.8.{ I$U$2 > %S+Q$h#/.g#J+,.J+,.c@c@c@c@c@c@c@c@c@c@c@c@` Y@!%!%T . .`$[+[+N O J J J $%I P P P P A A A ,%'%K s H.H.s ^%/%^%j t u t u.u.(%b a S.L+ ", +" D K@C@v u@k@k@k@j@f$/$f$f$h h h d d <@<@P$:@H$u$U#!@z$O#&@O#c.A$E#6.8.8.F$F$G$_ _ %> /.X$/.^.J+J+_.J+(.(.(.A+^#%.Y$c@c@c@c@c@c@c@c@T . .P@P@{%[+O N N J J $%P ,+B _%*%_%,%b@,%K K K H.s s s j j j i *@u.u.k :%(%a r.3 c s.3 ) R.1+ ", +" 2.s@k@e$j@j@p$f$p$h h q$<@<@<@s$t$t$U#U#W$O#O#c.A$A$A$A$ @7.8.{ { I$_ Q$J$> /./.g#J+J+J+J+8#(.(.M$A+%.%.S$T$-#-#*.)%Y@Y@U Y@-% .+%{%+%[+[+;%@%J $%&%P P X.X._%A A A V.,%K <%C C s /%s ^%u j u.u.u.u.a :%r.r.E.3 3 p.p.[%m.m.m.] 9 ^+ ", +" z@i@H@,$j$h @$m$d <@<@P$U#U#)@U#u$O#E$b.b.A$A$6.C$7.8.G$I$_ _ _ S+Q$/.K$R$^.J+'.(._.(.(.(.O$O$%.%.-#-#-#-#-#)%V$Y@T -% . . .{%[+N N J J J v@,+P _%>%X.B A '%A K G.G.<%r s /%{@j j j v.*@u.t.t.r.r.}%E.|%3 1%o.p.m.2%m.] 3%] / j.j.#+| | ", +" 9@9@h l$<@<@t$H$U#u$W$O#O#O#O#A$b.A$E# @8.8.8.I$_ _ /.S+1./.R$/.J+J+L$8#(.(.(.^#A+%.S$Z$%%-#*.-#)%=%Y@T V$-% ...`$+%[+O J J J '+&%J P P X._%A A V.A K K ]%C r ^%{@^%j j v.*@w.u.u.:%t.r.r.c q.3 1%1%3 m.4 ] 4 ] ] / * * * A.& & f.& < ++ ", +" 4%6@H$U#!@z$W$O#O#b.c.A$A$C$7.7.8.I$U$G$_ /.1.1././.R$^.J+_._.'.(.(.^#A+%.%.Z$T$-#-#=%)%Y@Y@T T . .`$`$+%[+[+O @%J ,+&%P P P W._%A A A K K K K G.s ^%F.s j u u j u u.k b r.|%s.s.3 3 [%p.[%m.m.] ^ ] ] k.( * = * - & $ % z.+ + # + .+.+ ", +" _@(@(@O#E$E$A$A$6.8.C$8.8.8._ _ _ S+S+/././.X$X$J+J+(.L$(.(.N$M$%.%.%%%%-#-#Y@)%Z 9+Y@ . . .`$+%[+O N O #%J J v@$%P P A *%A V.,%~%a@K K s s ^%^%5%/%i u.*@u.u.b r.r.r.|%3 s.3 3 1%m.m.m.] m.] 6%] * * i.- - - & + 7%+ + + y.. . . . . a+I.I. ", +" =.=.A$A$B$8. @I$F$G$G$_ S+ %/./.^.J+^.8#J+B+(.(.O$A+%.%.Y$%.T$-#-#=%Y@Y@!%-%U . ...[++%[+O @%J J '+P v@P W.B _%A A ,%,%K K <%s s {@{@^%j v.i t u.u.t.a r.r.r.E.E.3 o.D.m.m.C.l.3%] ( / j.* = A.& & g.g.z.+ d.y.. . . . . . . . . . . . I.I. ", +" >@>@>@8.8._ G$> > _ S+R$g#^.J+J+8#_.(.(.N$^#O$%.T$-#-#-#-#=%Y@Y@Y@!%9+ .[+P@..[+[+O J J J ,+$%P P B W.*%A ~%K K K <%s <%s F.5%/%j u v.u.w.u.k t.r.r.3 }%3 [%D.1%m.m.4 C.2%] ] ( 6%* A.- & & & + + + d.0+y.. . . . . . . . . . . . . . . . I.I.I. ", +" 1 1 _ J$/.J$/.R$J+R$J+8#_.(.(.M$O$O$%.Y$S$T$=%-#Z &.Y@Y@ .T ...`$[+[+N [+N J I '+v@P P W._%A A ,%A K ]%K C s s s s /%j v.w.j u.u.k :%r.|%r.q.3 3 3 n.m.m.2%C.] ] / B.* * * A.h.& z.+ + + 0++ 0+0+. . . . . . . . . . . . . . . . . . . . . I.I. ", +" : 3.R$K$J+J+(.L$(.A+N$N$%.%.Y$-#T$-#&.&.` Y@-%V$ . ...+%{%[+N [+J J ,+&%P P P P A A A A K K K K G.s s x.F.5%j j w.u.u.a u.r.r.r.3 q.c 1%1%o.m.m.2%C.] ] ] k.6%* = & ; & $ f.f.d.@ d.. . . . . . . . . . . . . . . . . . . . . . . . . . . . I.I. ", +" |@d@8#(.(.A+^#%.Y$-#-#-#-#*.&.Y@Y@Y@9+9+ .+%+%[+[+[+[+#%J J v@P P W.*%_%A A a@'%K K H.C <%x.F.5%j j i i *@u.:%b r.r.r.}%3 3 3 [%o.o.2%m.^ ^ ] / 6%j.= h.= h.& & f.+ + + y.y.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I.I. ", +" Q+[.l %.Y$Y$-#-#-#&.Z !%V$9+ . . . ..%[+V [+J J J v@J P P X._%A A a@V.~%]%K r s s s {@j j j i u.u.u.k (%r.}%|%c 3 1%p.3 m.^ C.] ] ] * * j.h.- ; & % 7%f.+ + + e.e.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I.I.I. ", +" ! ! -#)%Y@V$V$9+ . ...{%[+O [+@%J J '+I $%P P P A B A ~%b@V.<%r C s s s /%j j *@w.i u.u.k r.r.r.3 3 3 3 D.m.m.] 3%] ] 6%k.* * * = h.& & g.f.+ + y.# d.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I.I. ", +" #.#.E+U ..%[+{%[+V @%[+J J v@v@P B W.*%A V.a@'%K r <%C H.s /%j j j i *@u.u.k b t.r.q.|%|%3 3 n.1%4 m.3%] ] j.B.j.* * * & & & g.+ f.+ . # . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I.I.I. ", +" f+x+@.@.N+d+N+8+u+5+u+L L l+l+<+:+:+F >+>+>+2+2+x x c+(+E E T.E b+S.g S.g ) ) f n m m m 8 $+^+7 i+e 7 | | ~+K+K+++}+[ }+N.N.K.`.K.Z.K.8%I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I. ", +" 8+8+5+L L L <+D+:+4+F .@:+>+>+>+9%x x T+U.E U.E b+b+S.S.g w ) ) f R.n m m m ^+7 8 7 7 ]+Q.| | P.h+} < N.}+N.N.)+ +)+K.Z.Y.8%I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I. ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" "}; diff --git a/src/Mod/Ship/InitGui.py b/src/Mod/Ship/InitGui.py index 05dbfecb5..6cf4c9689 100644 --- a/src/Mod/Ship/InitGui.py +++ b/src/Mod/Ship/InitGui.py @@ -34,13 +34,13 @@ class ShipWorkbench ( Workbench ): # ToolBar list = ["Ship_LoadExample", "Ship_CreateShip", "Ship_OutlineDraw", "Ship_AreasCurve", "Ship_Hydrostatics"] self.appendToolbar("Ship design",list) - list = ["Ship_CreateTank"] + list = ["Ship_Weights", "Ship_CreateTank"] self.appendToolbar("Loading",list) # Menu list = ["Ship_LoadExample", "Ship_CreateShip", "Ship_OutlineDraw", "Ship_AreasCurve", "Ship_Hydrostatics"] self.appendMenu("Ship design",list) - list = ["Ship_CreateTank"] + list = ["Ship_Weights", "Ship_CreateTank"] self.appendToolbar("Loading",list) Gui.addWorkbench(ShipWorkbench()) diff --git a/src/Mod/Ship/Instance.py b/src/Mod/Ship/Instance.py index 16d77f868..adba4d22b 100644 --- a/src/Mod/Ship/Instance.py +++ b/src/Mod/Ship/Instance.py @@ -663,7 +663,7 @@ class ViewProviderShip: def sections(obj): """ Returns the discretization points of sections, with the advantage that is a list of nSections lists, with the points. - @param Ship object + @param obj Ship object @return Sections points """ histogram = obj.nPoints[:] @@ -674,3 +674,42 @@ def sections(obj): for j in range(histogram[i],histogram[i+1]): sections[i].append(points[j]) return sections + +def weights(obj): + """ Returns Ship weights list. If weights has not been sets, + this tool creates it. + @param obj Ship object + @return Weights list. None if errors + """ + # Test if is a ship instance + props = obj.PropertiesList + try: + props.index("IsShip") + except ValueError: + return None + if not obj.IsShip: + return None + # Test if properties already exist + try: + props.index("WeightNames") + except ValueError: + obj.addProperty("App::PropertyStringList","WeightNames","Ship", str(Translator.translate("Ship Weights names"))).WeightNames=[Translator.translate("Lightweight").__str__()] + try: + props.index("WeightMass") + except ValueError: + # Compute mass aproximation + from shipHydrostatics import Tools + disp = Tools.Displacement(obj,obj.Draft,0.0) + obj.addProperty("App::PropertyFloatList","WeightMass","Ship", str(Translator.translate("Ship Weights masses"))).WeightMass=[1000.0 * disp[1]] + try: + props.index("WeightPos") + except ValueError: + # Compute mass aproximation + from shipHydrostatics import Tools + disp = Tools.Displacement(obj,obj.Draft,0.0) + obj.addProperty("App::PropertyVectorList","WeightPos","Ship", str(Translator.translate("Ship Weights centers of gravity"))).WeightPos=[Vector(disp[2],0.0,obj.Draft)] + # Setup list + weights = [] + for i in range(0,len(obj.WeightNames)): + weights.append([obj.WeightNames[i], obj.WeightMass[i], obj.WeightPos[i]]) + return weights diff --git a/src/Mod/Ship/Makefile.am b/src/Mod/Ship/Makefile.am index 0251da41d..35c1957b7 100644 --- a/src/Mod/Ship/Makefile.am +++ b/src/Mod/Ship/Makefile.am @@ -34,6 +34,9 @@ nobase_data_DATA = \ Icons/ReparametrizeIco.xpm \ Icons/Ship.xcf \ Icons/Ship.xpm \ + Icons/Weight.png \ + Icons/Weight.xcf \ + Icons/Weight.xpm \ Icons/Tank.png \ Icons/Tank.xcf \ Icons/Tank.xpm \ @@ -66,6 +69,9 @@ nobase_data_DATA = \ shipUtils/Math.py \ shipUtils/Paths.py \ shipUtils/Translator.py \ + tankWeights/__init__.py \ + tankWeights/TaskPanel.py \ + tankWeights/TaskPanel.ui \ tankCreateTank/__init__.py \ tankCreateTank/TaskPanel.py \ tankCreateTank/TaskPanel.ui diff --git a/src/Mod/Ship/ShipGui.py b/src/Mod/Ship/ShipGui.py index f62bebfb4..71a9e75e4 100644 --- a/src/Mod/Ship/ShipGui.py +++ b/src/Mod/Ship/ShipGui.py @@ -84,6 +84,18 @@ class Hydrostatics: ToolTip = str(Translator.translate('Plot ship hydrostatics')) return {'Pixmap' : IconPath, 'MenuText': MenuText, 'ToolTip': ToolTip} +class SetWeights: + def Activated(self): + import tankWeights + tankWeights.load() + + def GetResources(self): + from shipUtils import Paths, Translator + IconPath = Paths.iconsPath() + "/Weight.png" + MenuText = str(Translator.translate('Set ship weights')) + ToolTip = str(Translator.translate('Set ship weights, tanks must be added later')) + return {'Pixmap' : IconPath, 'MenuText': MenuText, 'ToolTip': ToolTip} + class CreateTank: def Activated(self): import tankCreateTank @@ -101,4 +113,5 @@ FreeCADGui.addCommand('Ship_CreateShip', CreateShip()) FreeCADGui.addCommand('Ship_OutlineDraw', OutlineDraw()) FreeCADGui.addCommand('Ship_AreasCurve', AreasCurve()) FreeCADGui.addCommand('Ship_Hydrostatics', Hydrostatics()) +FreeCADGui.addCommand('Ship_Weights', SetWeights()) FreeCADGui.addCommand('Ship_CreateTank', CreateTank()) diff --git a/src/Mod/Ship/shipHydrostatics/Tools.py b/src/Mod/Ship/shipHydrostatics/Tools.py index a2b1f2c65..3db003957 100644 --- a/src/Mod/Ship/shipHydrostatics/Tools.py +++ b/src/Mod/Ship/shipHydrostatics/Tools.py @@ -116,7 +116,7 @@ def Displacement(ship, draft, trim): @param ship Selected ship instance @param draft Draft. @param trim Trim in degrees. - @return [areas,disp,xcb]: \n + @return [areas,disp,xcb,Cb]: \n areas : Area of each section \n disp: Ship displacement \n xcb: X bouyance center coordinate diff --git a/src/Mod/Ship/tankWeights/TaskPanel.py b/src/Mod/Ship/tankWeights/TaskPanel.py new file mode 100644 index 000000000..14cda21e5 --- /dev/null +++ b/src/Mod/Ship/tankWeights/TaskPanel.py @@ -0,0 +1,212 @@ +#*************************************************************************** +#* * +#* Copyright (c) 2011, 2012 * +#* Jose Luis Cercos Pita * +#* * +#* This program is free software; you can redistribute it and/or modify * +#* it under the terms of the GNU Lesser General Public License (LGPL) * +#* as published by the Free Software Foundation; either version 2 of * +#* the License, or (at your option) any later version. * +#* for detail see the LICENCE text file. * +#* * +#* 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 Library General Public License for more details. * +#* * +#* You should have received a copy of the GNU Library General Public * +#* License along with this program; if not, write to the Free Software * +#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +#* USA * +#* * +#*************************************************************************** + +# FreeCAD modules +import FreeCAD as App +import FreeCADGui as Gui +# Qt library +from PyQt4 import QtGui,QtCore +# Module +from Instance import * +from shipUtils import Paths, Translator + +class TaskPanel: + def __init__(self): + self.ui = Paths.modulePath() + "/tankWeights/TaskPanel.ui" + self.ship = None + + def accept(self): + if not self.ship: + return False + # Setup lists + name = [] + mass = [] + pos = [] + for i in range(0,self.form.weights.rowCount() - 1): + item = self.form.weights.item(i,0) + name.append(item.text().__str__()) + item = self.form.weights.item(i,1) + mass.append(item.text().toFloat()[0]) + vec = [] + item = self.form.weights.item(i,2) + vec.append(item.text().toFloat()[0]) + item = self.form.weights.item(i,3) + vec.append(item.text().toFloat()[0]) + item = self.form.weights.item(i,4) + vec.append(item.text().toFloat()[0]) + pos.append(App.Base.Vector(vec[0],vec[1],vec[2])) + # Send to ship + self.ship.WeightNames = name[:] + self.ship.WeightMass = mass[:] + self.ship.WeightPos = pos[:] + return True + + def reject(self): + if not self.ship: + return False + return True + + def clicked(self, index): + pass + + def open(self): + pass + + def needsFullSpace(self): + return True + + def isAllowedAlterSelection(self): + return False + + def isAllowedAlterView(self): + return True + + def isAllowedAlterDocument(self): + return False + + def helpRequested(self): + pass + + def setupUi(self): + mw = self.getMainWindow() + form = mw.findChild(QtGui.QWidget, "TaskPanel") + form.weights = form.findChild(QtGui.QTableWidget, "Weights") + self.form = form + # Initial values + if self.initValues(): + return True + self.retranslateUi() + # Connect Signals and Slots + QtCore.QObject.connect(form.weights,QtCore.SIGNAL("cellChanged(int,int)"),self.onTableItem); + + def getMainWindow(self): + "returns the main window" + # using QtGui.qApp.activeWindow() isn't very reliable because if another + # widget than the mainwindow is active (e.g. a dialog) the wrong widget is + # returned + toplevel = QtGui.qApp.topLevelWidgets() + for i in toplevel: + if i.metaObject().className() == "Gui::MainWindow": + return i + raise Exception("No main window found") + + def initValues(self): + """ Get selected geometry. + @return False if sucessfully values initialized. + """ + # Get selected objects + selObjs = FreeCADGui.Selection.getSelection() + if not selObjs: + msg = Translator.translate("Ship instance must be selected (no object selected)\n") + App.Console.PrintError(msg) + return True + for i in range(0,len(selObjs)): + obj = selObjs[i] + # Test if is a ship instance + props = obj.PropertiesList + try: + props.index("IsShip") + except ValueError: + continue + if obj.IsShip: + # Test if another ship already selected + if self.ship: + msg = Translator.translate("More than one ship selected (extra ship will be neglected)\n") + App.Console.PrintWarning(msg) + break + self.ship = obj + # Test if any valid ship was selected + if not self.ship: + msg = Translator.translate("Ship instance must be selected (no valid ship found at selected objects)\n") + App.Console.PrintError(msg) + return True + # Get weights + w = weights(self.ship) + # Set the items + self.form.weights.setRowCount(len(w)+1) + for i in range(0,len(w)): + item = QtGui.QTableWidgetItem(w[i][0]) + self.form.weights.setItem(i,0,item) + string = '%g' % (w[i][1]) + item = QtGui.QTableWidgetItem(string) + self.form.weights.setItem(i,1,item) + string = '%g' % (w[i][2].x) + item = QtGui.QTableWidgetItem(string) + self.form.weights.setItem(i,2,item) + string = '%g' % (w[i][2].y) + item = QtGui.QTableWidgetItem(string) + self.form.weights.setItem(i,3,item) + string = '%g' % (w[i][2].z) + item = QtGui.QTableWidgetItem(string) + self.form.weights.setItem(i,4,item) + msg = Translator.translate("Ready to work\n") + App.Console.PrintMessage(msg) + return False + + def retranslateUi(self): + """ Set user interface locale strings. + """ + self.form.setWindowTitle(Translator.translate("Set weights")) + labels = [] + labels.append(Translator.translate("Name")) + labels.append(Translator.translate("Mass") + " [kg]") + labels.append(QtCore.QString("g.x [m]")) + labels.append(QtCore.QString("g.y [m]")) + labels.append(QtCore.QString("g.z [m]")) + self.form.weights.setHorizontalHeaderLabels(labels) + + def onTableItem(self, row, column): + """ Function called when an item of table is changed. + @param row Changed item row + @param column Changed item column + """ + item = self.form.weights.item(row,column) + # Row deletion + if column == 0: + if not item.text(): + self.form.weights.removeRow(row) + # Ensure that exist one empty item at the end + nRow = self.form.weights.rowCount() + last = self.form.weights.item(nRow-1,0) + if last: + if(last.text() != ''): + self.form.weights.setRowCount(nRow+1) + # Fields must be numbers + for i in range(0,self.form.weights.rowCount()-1): # Avoid last row + for j in range(1,self.form.weights.columnCount()): # Avoid name column + item = self.form.weights.item(i,j) + if not item: + item = QtGui.QTableWidgetItem('0.0') + self.form.weights.setItem(i,j,item) + continue + (number,flag) = item.text().toFloat() + if not flag: + item.setText('0.0') + +def createTask(): + panel = TaskPanel() + Gui.Control.showDialog(panel) + if panel.setupUi(): + Gui.Control.closeDialog(panel) + return None + return panel diff --git a/src/Mod/Ship/tankWeights/TaskPanel.ui b/src/Mod/Ship/tankWeights/TaskPanel.ui new file mode 100644 index 000000000..23dc4ff1b --- /dev/null +++ b/src/Mod/Ship/tankWeights/TaskPanel.ui @@ -0,0 +1,97 @@ + + + TaskPanel + + + + 0 + 0 + 260 + 256 + + + + Set wieghts + + + + + + true + + + 1 + + + 5 + + + false + + + 20 + + + false + + + false + + + + + Name + + + + + Mass [kg] + + + + + g.x [m] + + + + + g.y [m] + + + + + g.z [m] + + + + + Lightweight + + + + + 0.0 + + + + + 0.0 + + + + + 0.0 + + + + + 0.0 + + + + + + + + + diff --git a/src/Mod/Ship/tankWeights/__init__.py b/src/Mod/Ship/tankWeights/__init__.py new file mode 100644 index 000000000..cbfb57d75 --- /dev/null +++ b/src/Mod/Ship/tankWeights/__init__.py @@ -0,0 +1,36 @@ +#*************************************************************************** +#* * +#* Copyright (c) 2011, 2012 * +#* Jose Luis Cercos Pita * +#* * +#* This program is free software; you can redistribute it and/or modify * +#* it under the terms of the GNU Lesser General Public License (LGPL) * +#* as published by the Free Software Foundation; either version 2 of * +#* the License, or (at your option) any later version. * +#* for detail see the LICENCE text file. * +#* * +#* 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 Library General Public License for more details. * +#* * +#* You should have received a copy of the GNU Library General Public * +#* License along with this program; if not, write to the Free Software * +#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +#* USA * +#* * +#*************************************************************************** + +# FreeCAD modules +import FreeCAD +import FreeCADGui + +# Qt libraries +from PyQt4 import QtGui,QtCore + +# Main object +import TaskPanel + +def load(): + """ Loads the tool """ + TaskPanel.createTask()